2012-02-16 19 views
13

Mi problema en realidad parece bastante tonto ... Estoy escribiendo una aplicación para iPhone que usa MKMapKit. La aplicación toma los metadatos EXIF ​​de una fotografía geoetiquetada proporcionada. El problema es que la latitud y longitud coordenadas que puedo recuperar, por ejemplo:¿Cómo obtengo la latitud y la longitud correctas de una foto de iPhone cargada?

Latitud: 34.25733333333334

Lon: 118,5373333333333

devuelve un lugar en China. ¿Hay alguna configuración regional que me falta o necesito convertir las coordenadas lat/long antes de usarlas?

Gracias de antemano por cualquier ayuda que pueda proporcionar.

Aquí está el código que estoy usando para captar los datos del GPS. Se dará cuenta de que estoy tala todo para la consola para que pueda ver lo que los valores son:

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

un poco de código sería bueno – Novarg

+0

Acabo de actualizarlo con un ejemplo de código. –

+0

¿Qué es 'self.lat' y' self.lng'? El tipo no está claro por el uso. – Tim

Respuesta

14

Creo que debería tomar el valor con lo siguiente:

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

¡PERFECTO! Eso fue todo. Muchas gracias! –

+1

Hmm. Esto no funciona para mí Tomo la foto y, tan pronto como recupero la imagen a través de ** UIImagePickerControllerDelegate ** reviso los activos.ALAssetPropertyLocation cuenta no es presente, aún con el permiso ya concedido a la aplicación en cuestión (y para la aplicación de la cámara, Fwiw), en iOS 5.x en un iPhone 4 y el iPad de 3ª generación. Gracias –

+0

de Trabajo como un encanto ... –

2

¿Estás seguro de que no se está perdiendo un signo menos en la que 118? 34.257, -118.5373 está muy bien dentro de Los Angeles, California.

+0

Gracias por mirar esto. Es tan extraño. El lat/lng que obtengo de cualquier foto no tiene ningún signo menos. Me preocupa que si asumo automáticamente un signo menos, pueda obtener resultados inexactos. –

+0

Publique el código que está utilizando para obtener lat/lng. Puede estar realizando un lanzamiento que está eliminando el signo. – Tim

+0

Acabo de actualizarlo con mi código. –

1

Si bien se puede obtener la ubicación del activo por @Allen, también es válida para obtener de los metadatos GPS como que estaba tratando de hacer inicialmente. No estoy 100% seguro de que la coordenada de la biblioteca de activos será la misma que la coord en los metadatos de GPS, depende de cómo Apple almacene esta coord. Por ejemplo, si está usando una marca de tiempo, la marca de tiempo de la biblioteca de Activos es diferente de la fecha de creación EXIF ​​(un tema diferente, ciertamente).

En cualquier caso, la razón por la que tienen el mal coord es b/c también es necesario para obtener la información de la dirección de la siguiente manera:

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

Esto también funciona,

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

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

    }; 
+0

En una nota relacionada, por favor, no [aprobar las modificaciones sugeridas] (http://stackoverflow.com/review/suggested-edits/2846283) utilizando acentos abiertos para el énfasis, pero rechazan o mejorar ellos - ver, por ejemplo [aquí] (http://meta.gaming.stackexchange.com/q/7437/88) por qué –

+0

Esto no funcionará correctamente. No incluye el signo '-' para valores lat o long. así que desafortunadamente da un resultado incorrecto. –

0

I Creo que la razón de que no haya un signo negativo es debido a los metadatos: exif:GPSLongitudeRef: W que (creo) significa que debe haber un signo negativo delante de la longitud, ya que está haciendo referencia al hemisferio occidental. Creo que esto también se aplica a la latitud pero con exif:GPSLatitudeRef: N para los hemisferios norte y sur. Espero que esto haya ayudado. Me di cuenta de que esto es exactamente lo que dijo @XJones. Metadatos usando ImageMagick.

Cuestiones relacionadas