2012-02-16 332 views
13

我的问题其实似乎很愚蠢......我在写一个使用MKMapKit的iPhone应用程序。该应用从提供的带地理标记的照片中抓取EXIF元数据。问题是,纬度和经度坐标,我检索,例如:如何从上传的iPhone照片获取正确的经度和纬度?

纬度: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; 

} 
+0

有点代码会很好 – Novarg 2012-02-16 21:52:15

+0

刚刚更新了一个代码示例。 – 2012-02-16 22:02:16

+0

什么是self.lat和self.lng?使用类型不明确。 – Tim 2012-02-16 22:06:37

回答

14

我认为你应该使用下面的抢值:

CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation]; 
+0

完美!就是这样。非常感谢! – 2012-02-16 22:20:01

+1

嗯。这不适合我。我拍了这张照片,一旦我通过** UIImagePickerControllerDelegate **获取图像,我就检查资产。即使已经授予相关应用程序(以及相机应用程序,FWIW)的许可,ALSsetPropertyLocation也是*不存在,在iPhone 4和iPad 3上的iOS 5.x上。 – 2012-06-17 11:00:54

+0

Thanx工作就像一个魅力... – 2014-10-08 10:12:16

2

你确定你不会错过对118减号? 34.257, -118.5373在洛杉矶,加州很好。

+0

谢谢你看这个。这很奇怪。我从任何照片获得的经纬度都没有任何减号。我担心,如果我只是自动承担一个负号,我可能会得到不准确的结果。 – 2012-02-16 21:50:49

+0

发布你正在使用的代码来获取纬度/经度。它可能正在执行正在移除符号的演员。 – Tim 2012-02-16 21:52:06

+0

刚刚用我的代码更新了它。 – 2012-02-16 22:01:55

1

虽然你可以从每@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); 
0

这也将工作,

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

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

    }; 
+0

在一个不相关的说明,请不要[批准建议的编辑](http://stackoverflow.com/review/suggested-edits/2846283)使用反引号强调,但拒绝或改善他们 - 见例如[here](http://meta.gaming.stackexchange.com/q/7437/88)为什么 – 2013-09-03 06:46:09

+0

这将无法正常工作。它不包含经纬度或长整数值的' - '符号。所以不幸的是结果不对。 – 2014-10-08 10:13:30

0

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

相关问题