2012-02-16 57 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的元數據。

相關問題