Как я могу получить правильную широту и долготу с загруженной фотографии iPhone? - PullRequest
13 голосов
/ 17 февраля 2012

Моя проблема на самом деле кажется довольно глупой ... Я пишу приложение для iPhone, которое использует MKMapKit. Приложение получает метаданные EXIF ​​с предоставленной фотографии с геотегами. Проблема в том, что координаты широты и долготы, которые я получаю, например:

Lat: 34.25733333333334

Lon: 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;

}

Ответы [ 5 ]

14 голосов
/ 17 февраля 2012

Я думаю, вы должны получить значение, используя следующее:

 CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation];
2 голосов
/ 09 августа 2012

Хотя вы можете получить местоположение из ресурса для @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);
2 голосов
/ 17 февраля 2012

Вы уверены, что не пропустите знак минус на этом 118? 34.257, -118.5373 в Лос-Анджелесе, Калифорния

0 голосов
/ 26 сентября 2013

Я считаю, что причина отсутствия отрицательного знака заключается в метаданных: exif:GPSLongitudeRef: W, что (я считаю) означает, что перед долготой должен быть отрицательный знак, так как он ссылается на западное полушарие , Я считаю, что это относится и к широте, но с exif:GPSLatitudeRef: N для северного и южного полушарий. Надеюсь, что это помогло. Просто понял, что это именно то, что сказал @XJones. Метаданные с использованием ImageMagick.

0 голосов
/ 19 августа 2013

Это тоже будет работать,

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

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

    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...