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

如何从上传的iPhone照片中获得正确的纬度和经度?,iphone,ios,mapkit,Iphone,Ios,Mapkit,我的问题看起来很傻。。。我正在编写一个使用MKMapKit的iPhone应用程序。该应用程序从提供的带地理标记的照片中获取EXIF元数据。问题在于我检索的纬度和经度坐标,例如: 纬度:34.25733334 伦敦:118.5373333 返回在中国的位置。是否缺少区域设置,或者在使用之前是否需要转换纬度/经度坐标 提前感谢您提供的任何帮助 这是我用来抓取GPS数据的代码。您会注意到我正在将所有内容记录到控制台,以便查看值: void (^ALAssetsLibraryAssetForURLRes

我的问题看起来很傻。。。我正在编写一个使用MKMapKit的iPhone应用程序。该应用程序从提供的带地理标记的照片中获取EXIF元数据。问题在于我检索的纬度和经度坐标,例如:

纬度:34.25733334

伦敦:118.5373333

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

提前感谢您提供的任何帮助

这是我用来抓取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;

}

你确定你没有在118上漏掉一个减号吗?位于加利福尼亚州洛杉矶市境内。

你确定你没有在118号上漏掉一个减号吗?位于加利福尼亚州洛杉矶市境内。我认为您应该使用以下方法获取价值:

 CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation];

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

 CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation];

虽然您可以根据@Allen从资产中获取位置,但正如您最初尝试的那样,从GPS元数据中获取位置也是有效的。我不能100%确定资产库坐标是否与GPS元数据中的坐标相同,这取决于苹果如何存储该坐标。例如,如果您使用的是时间戳,那么资产库时间戳与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);

虽然您可以根据@Allen从资产中获取位置,但正如您最初尝试的那样,从GPS元数据中获取位置也是有效的。我不能100%确定资产库坐标是否与GPS元数据中的坐标相同,这取决于苹果如何存储该坐标。例如,如果您使用的是时间戳,那么资产库时间戳与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);
这也会起作用,

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

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

    };
这也会起作用,

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

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

    };

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

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

感谢您查看此文档。真奇怪。我从任何照片中得到的lat/lng没有任何负号。我担心如果我只是自动假设一个减号,我可能会得到不准确的结果。发布你用来获取lat/lng的代码。它可能正在执行一个正在移除该标志的演员阵容。感谢您观看。真奇怪。我从任何照片中得到的lat/lng没有任何负号。我担心如果我只是自动假设一个减号,我可能会得到不准确的结果。发布你用来获取lat/lng的代码。它可能正在执行删除标志的强制转换。刚刚用代码示例更新了它。什么是self.lat和self.lng?使用类型不清楚。我只使用两个IVAR来存储检索到的lat和lng。它们是双色的。我还尝试将它们存储为nsstring,然后将它们转换为double。同样的结果。@LeachyPeachy您用什么方法使用这个代码块?刚刚用一个代码示例更新了它。什么是self.lat和self.lng?使用类型不清楚。我只使用两个IVAR来存储检索到的lat和lng。它们是双色的。我还尝试将它们存储为nsstring,然后将它们转换为double。同样的结果。@LeachyPeachy你用什么方法使用这个代码块?太好了!就这样。非常感谢你!嗯,这对我不管用。我拍摄了照片,一旦我通过UIImagePickerControllerDelegate获得图像,我就会检查资产。ALAssetPropertyLocation不存在,即使已授予相关应用程序以及iPhone 4和iPad第三代完美版iOS 5.x上的摄像头应用程序FWIW的权限!就这样。非常感谢你!嗯,这对我不管用。我拍摄了照片,一旦我通过UIImagePickerControllerDelegate获得图像,我就会检查资产。阿拉塞特酒店
on不存在,即使已授予相关应用程序以及iPhone 4和iPad第三代iOS 5.x上的摄像头应用程序FWIW的许可。请注意,请不要使用反勾号来强调,而是拒绝或改进它们-例如,请参阅为什么这不能正常工作。对于lat或long值,它都不包含“-”符号。因此,不幸的是给出了错误的结果。在一个不相关的注释上,请不要使用反勾号来强调,而是拒绝或改进它们-例如,请参阅为什么这不能正确工作。对于lat或long值,它都不包含“-”符号。所以不幸的是给出了错误的结果。