如何从上传的 iPhone 照片中获取正确的纬度和经度?

13

我遇到的问题似乎很傻。我正在编写一个使用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;

}

刚刚更新了一个代码示例。 - Leachy Peachy
self.latself.lng是什么?从使用中无法确定类型。 - Tim
我只使用了两个ivar来存储检索到的纬度和经度。它们的类型是double。(我也尝试将它们存储为NSString,然后将其转换为double。但结果相同。) - Leachy Peachy
@LeachyPeachy,您在使用哪种方法来运用这个代码块? - bdv
5个回答

14

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

 CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation];

1
嗯,这对我不起作用。我拍照后,一旦通过UIImagePickerControllerDelegate获取图像返回,我检查资产。即使已经授予有关应用程序(以及相机应用程序)的权限,在iPhone 4和iPad第三代上的iOS 5.x上,ALAssetPropertyLocation也不存在。 - Joe D'Andrea

2
虽然根据@Allen的说法,您可以从资产中获取位置,但最初尝试从GPS元数据获取位置也是有效的。我不确定资产库坐标是否与GPS元数据中的坐标相同,这取决于苹果如何存储此坐标。例如,如果您使用时间戳,则资产库时间戳与EXIF创建日期不同(诚然,这是另一个话题)。
无论如何,您的坐标错误的原因是因为您还需要获取以下方向信息:
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);

2

你确定那个118前面没有漏掉一个减号吗?34.257, -118.5373这个坐标位于加州洛杉矶市内。


谢谢您查看此内容。这很奇怪。我从任何照片中获取的经纬度都没有负号。我担心如果我自动假设一个负号,可能会得到不准确的结果。 - Leachy Peachy
发布您正在使用的代码以获取纬度/经度。它可能执行了一个转换操作,这会删除符号。 - Tim

0

这也可以工作,

void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
    {
        ALAssetRepresentation *rep = [asset defaultRepresentation];
        NSDictionary *metadata = rep.metadata;

        NSMutableDictionary *GPSDictionary = [[[metadata objectForKey:(NSString *)kCGImagePropertyGPSDictionary]mutableCopy] autorelease];

    };

顺便说一下,请不要使用反引号强调批准建议的编辑,而是拒绝或改进它们-例如,在这里看看为什么。 - Tobias Kienzler
这样做不正确。它没有为纬度或经度值包括“-”符号,因此不幸地给出了错误的结果。 - Hemant Sharma

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接