2012-02-16 18 views
13

Mój problem wydaje się raczej głupi ... Piszę aplikację na iPhone'a, która używa MKMapKit. Aplikacja pobiera metadane EXIF ​​z podanego geotagowanego zdjęcia. Problemem jest to, że szerokość i długość geograficzną, że ja odzyskać, na przykład:Jak uzyskać prawidłową szerokość i długość geograficzną z przesłanego zdjęcia iPhone?

Lat: 34,25733333333334

Lon: 118,5373333333333

zwraca lokalizację w Chinach. Czy jest jakieś regionalne ustawienie, którego mi brakuje, czy muszę zmienić współrzędne długie/długie przed ich użyciem?

Z góry dziękujemy za wszelką pomoc.

Oto kod, którego używam do pobierania danych GPS. Zauważysz, ja wszystko zalogowaniu do konsoli, więc mogę zobaczyć jakie wartości są następujące:

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

trochę kodu byłoby fajnie – Novarg

+0

Właśnie zaktualizowałem to z próbką kodu. –

+0

Co to są 'self.lat' i' self.lng'? Typ nie wynika z użycia. – Tim

Odpowiedz

14

myślę, że należy chwycić za pomocą następujących wartości:

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

PERFECT! To było to. Dziękuję bardzo! –

+1

Hmm. To nie działa dla mnie. Robię zdjęcie i, jak tylko dostanę obraz za pośrednictwem ** UIImagePickerControllerDelegate ** sprawdzam zasoby.ALAssetPropertyLocation jest * nie * obecny, nawet za zgodą już udzieloną danemu app (i aplikacji Camera, FWIW), na iOS 5.x na iPhone 4 i iPad 3rd gen. –

+0

Thanx Działa jak zaklęcie ... –

2

Czy jesteś pewien, że nie brakuje na ten znak minus 118? 34.257, -118.5373 jest ładnie w Los Angeles, w Kalifornii.

+0

Dziękuję za obejrzenie tego. To jest takie dziwne. Lat/lng, które uzyskuję z dowolnych zdjęć, nie ma żadnego znaku minus. Martwię się, że jeśli po prostu automatycznie założę znak minus, mogę uzyskać niedokładne wyniki. –

+0

Opublikuj kod, którego używasz, aby uzyskać lat/lng. Może to być obsada, która usuwa znak. – Tim

+0

Właśnie zaktualizowałem to z moim kodem. –

1

Chociaż można uzyskać lokalizację z aktywów za @Allen, jest również ważne, aby ją z metadanych GPS, jak staraliśmy się na początek. Nie jestem w 100% pewien, czy współrzędne biblioteki zasobów będą takie same jak współrzędne w metadanych GPS, to zależy od tego, w jaki sposób Apple przechowuje to współrzędne. Na przykład, jeśli używasz znacznika czasu, znacznik czasu biblioteki zasobów jest inny niż data utworzenia EXIF ​​(inny temat, co prawda).

W każdym przypadku, powodem masz coord źle jest b/c trzeba także uzyskać informacje o kierunku, co następuje:

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

to również będzie działa,

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

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

    }; 
+0

W przypadku niepowiązanej uwagi, nie należy [zatwierdzać sugerowanych zmian] (http://stackoverflow.com/review/suggested-edits/2846283), używając backticks dla podkreślenia, ale odrzuć lub popraw je - patrz np [tutaj] (http://meta.gaming.stackexchange.com/q/7437/88) dlaczego –

+0

To nie zadziała poprawnie. Nie zawiera znaku "-" dla wartości zarówno długich, jak i długich. więc niestety daje zły wynik. –

0

I uważają, że powodem, dla którego nie ma znaku ujemnego, są metadane: exif:GPSLongitudeRef: W, które (jak sądzę) oznaczają, że przed długością geograficzną powinien znajdować się znak ujemny, ponieważ odnosi się on do zachodniej półkuli. Uważam, że dotyczy to również szerokości geograficznej, ale z exif:GPSLatitudeRef: N dla północnej i południowej półkuli. Mam nadzieję, że to pomogło. Właśnie zdałem sobie sprawę, że to jest dokładnie to, co powiedział @XJones. Metadane za pomocą ImageMagick.

Powiązane problemy