【问题标题】:How Do I Get The Correct Latitude and Longitude From An Uploaded iPhone Photo?如何从上传的 iPhone 照片中获取正确的纬度和经度?
【发布时间】:2012-04-24 09:07:56
【问题描述】:

我的问题实际上看起来相当愚蠢...我正在编写一个使用 MKMapKit 的 iPhone 应用程序。该应用程序从提供的带有地理标记的照片中获取 EXIF 元数据。问题是我检索到的经纬度坐标,例如:

纬度:34.25733333333334

伦敦:118.5373333333333

返回中国的位置。是否存在我缺少的区域设置,或者我需要在使用它们之前转换纬度/经度坐标吗?

提前感谢大家提供的任何帮助。

这是我用来获取 GPS 数据的代码。您会注意到我将所有内容都记录到控制台,以便查看值是什么:

void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
{
    NSDictionary *metadata = asset.defaultRepresentation.metadata;
    NSLog(@"Image Meta Data: %@",metadata);
    NSDictionary *gpsdata = [metadata objectForKey:@"{GPS}"];
    self.lat = [gpsdata valueForKey:@"Latitude"];
    self.lng = [gpsdata valueForKey:@"Longitude"];
    NSLog(@"\nLatitude: %@\nLongitude: %@",self.lat,self.lng);
};

NSURL *assetURL = [mediaInfo objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL
         resultBlock:ALAssetsLibraryAssetForURLResultBlock
        failureBlock:^(NSError *error) {
        }];

UIImage *img = [mediaInfo objectForKey:@"UIImagePickerControllerEditedImage"];
previewImage.image = nil;
self.previewImage.image = img;

NSData *imageData = UIImagePNGRepresentation(img);
if ([imageData length] > 0) {
    self._havePictureData = YES;

}

【问题讨论】:

  • 刚刚用代码示例更新了它。
  • 什么是self.latself.lng?从用法上看不清楚类型。
  • 我只使用两个 ivars 来存储检索到的 lat & lng。它们是双重类型。 (我也尝试将它们存储为 NSStrings,然后将它们转换为双精度值。结果相同。)
  • @LeachyPeachy 你用什么方法使用这个代码块?

标签: iphone ios mapkit


【解决方案1】:

我认为没有负号的原因是因为元数据:exif:GPSLongitudeRef: W 这(我相信)意味着经度前面应该有一个负号,因为它指的是西半球.我相信这也适用于纬度,但exif:GPSLatitudeRef: N 用于北半球和南半球。希望这会有所帮助。刚刚意识到这正是@XJones 所说的。使用 ImageMagick 的元数据。

【讨论】:

    【解决方案2】:

    这也可以,

    void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
        {
            ALAssetRepresentation *rep = [asset defaultRepresentation];
            NSDictionary *metadata = rep.metadata;
    
            NSMutableDictionary *GPSDictionary = [[[metadata objectForKey:(NSString *)kCGImagePropertyGPSDictionary]mutableCopy] autorelease];
    
        };
    

    【讨论】:

    • 在不相关的注释上,请不要 approve suggested edits 使用反引号来强调,而是拒绝或改进它们 - 参见例如here为什么
    • 这将无法正常工作。它不包括用于 lat 或 long 值的“-”符号。所以不幸的是给出了错误的结果。
    【解决方案3】:

    虽然您可以根据 @Allen 从资产中获取位置,但也可以像最初尝试那样从 GPS 元数据中获取位置。我不能 100% 确定资产库坐标是否与 GPS 元数据中的坐标相同,这取决于 Apple 如何存储该坐标。例如,如果您使用时间戳,则资产库时间戳与 EXIF 创建日期不同(当然是不同的主题)。

    无论如何,您的坐标错误的原因是 b/c 您还需要获取方向信息,如下所示:

    NSDictionary *metadata = asset.defaultRepresentation.metadata;
    NSLog(@"Image Meta Data: %@",metadata);
    NSDictionary *gpsdata = [metadata objectForKey:@"{GPS}"];
    self.lat = [gpsdata valueForKey:@"Latitude"];
    self.lng = [gpsdata valueForKey:@"Longitude"];
    
    // lat is negative is direction is south
    if ([[gpsdata valueForKey:@"LatitudeRef"] isEqualToString:@"S"]) {
        self.lat = -self.lat;
    }
    
    // lng is negative if direction is west
    if ([[gpsdata valueForKey:@"LongitudeRef"] isEqualToString:@"W"]) {
        self.lng = -self.lng;
    }
    
    NSLog(@"\nLatitude: %@\nLongitude: %@",self.lat,self.lng);
    

    【讨论】:

      【解决方案4】:

      我认为您应该使用以下方法获取价值:

       CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation];
      

      【讨论】:

      • 完美!就是这样。非常感谢!
      • 嗯。这对我不起作用。我拍了照片,一旦通过 UIImagePickerControllerDelegate 取回图像,我就会检查资产。在 iPhone 4 和第三代 iPad 上的 iOS 5.x 上,ALAssetPropertyLocation 存在,即使已授予相关应用(以及相机应用 FWIW)的权限。
      【解决方案5】:

      您确定没有遗漏 118 上的减号吗? 34.257, -118.5373 位于加利福尼亚州洛杉矶。

      【讨论】:

      • 感谢您查看此内容。太奇怪了。我从任何照片中得到的纬度/经度都没有任何减号。我担心如果我只是自动假设一个减号,我可能会得到不准确的结果。
      • 发布您用来获取 lat/lng 的代码。它可能正在执行一个正在移除标志的演员。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多