iPhone Pobierz UIImagePickerController Lat / Lng

Używam UIImagePickerController, aby zrobić zdjęcie, a następnie przesłać zdjęcie do WCF Service. Wraz z obrazem, muszę również wysłać do szerokości i długości geograficznej zdjęcia.

Jak mogę zdobyć te informacje z zrobionego zdjęcia?

Szukałem w Internecie, ale nie mogę znaleźć dobrego źródła informacji. Widziałem DANE EXIF, które są przekazywane przez klucz UIImagePickerControllerMediaMetadata jako część metody delegata didFinishPickingMediaWithInfo. Jednak, kiedy wydrukować zawartość do dziennika, nie ma informacji o lokalizacji.

Czy coś mi umyka, Czy muszę włączyć usługi lokalizacyjne przed zrobieniem zdjęcia? Czy jest inny sposób, aby uzyskać informacje?

Wielkie dzięki.
Author: Jagat Dave, 2011-05-30

4 answers

Zastanawiałam się nad tym od kilku dni i w końcu znalazłam rozwiązanie. Jak już sugerowano, możesz użyć ALAssetsLibrary .

Selektor obrazów wyświetli słownik, który zawiera adres url wskazujący na zasób.

Metoda ALAssetsLibrary używa bloków. Możesz przeczytać więcej o nich z przykładu tutaj . Tak więc w ten sposób radzimy sobie z informacjami podanymi przez selektora:

- (void)imagePickerController:(UIImagePickerController *)picker
            didFinishPickingMediaWithInfo:(NSDictionary *)info
{

    if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary) {
        // We'll store the info to use in another function later
        self.imageInfo = info;

        // Get the asset url
        NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];

        // We need to use blocks. This block will handle the ALAsset that's returned: 
        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
        {
            // Get the location property from the asset  
            CLLocation *location = [myasset valueForProperty:ALAssetPropertyLocation];
            // I found that the easiest way is to send the location to another method
            [self handleImageLocation:location];
        };
        // This block will handle errors:
        ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
        {
            NSLog(@"Can not get asset - %@",[myerror localizedDescription]);
            // Do something to handle the error
        };


        // Use the url to get the asset from ALAssetsLibrary,
        // the blocks that we just created will handle results
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:url 
                       resultBlock:resultblock
                      failureBlock:failureblock];

    }
    [picker dismissModalViewControllerAnimated:YES];
    [picker release];
}

A następnie metoda, która obsługuje obraz i dane o lokalizacji:

- handleImageLocation:(CLLocation *)location 
{
    UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage];
    // Do something with the image and location data...
}

I oczywiście możesz również uzyskać inne informacje o obrazie za pomocą tej metody za pomocą klawiszy:

ALAssetPropertyType
ALAssetPropertyLocation
ALAssetPropertyDuration
ALAssetPropertyOrientation
ALAssetPropertyDate
ALAssetPropertyRepresentations
ALAssetPropertyURLs
 15
Author: lari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 10:01:58

Nowy od iOS 8

To było skomplikowane z ALAssetLibrary, który jest obecnie przestarzały, użyj Zdjęcia.Ramy zamiast tego.

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let assertURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
        let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assertURL], options: nil)
        if let asset = fetchResult.firstObject as? PHAsset
        {
            print(asset.location)
        }
    }
}

Szybko i łatwo:)

 3
Author: Yuchen Zhong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-18 03:12:44

To chyba "robak". UIImagePickerViewController nie zwróci danych lokalizacji wybranych obrazów: jak już odkryłeś, są one usuwane z metadanych.

Jeśli jednak użyjesz ALAssetLibrary, Aby uzyskać obrazy, możesz uzyskać dane lokalizacji (w postaci obiektu CLLocation powiązanego z obrazem). W tym pytaniu jest jakiś kod- problem z obrazem iphone ' a - który pomoże ci uzyskać ALAsset z UIImagePickerController.

Oczywiście byłoby łatwiej, gdybyś mógł po prostu od razu uzyskaj te informacje od selekcjonera, więc rozważ złożenie wniosku o funkcję w Apple.

 1
Author: lxt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:28

Jako że Twój typ źródłowy wydaje się być UIImagePickerControllerSourceTypeCamera, to robi się bardzo frustrujące bardzo szybko, jak już wiesz. Informacja o lokalizacji wydaje się być zaginiona.

Jako alternatywę dla UIImageWriteToSavedPhotosAlbum() (która nie odnosi się do zapisanego obrazu) próbowałem ALAssetsLibrary i -writeImageToSavedPhotosAlbum:metadata:completionBlock: (używając UIImagePickerControllerMediaMetadata do wypełnienia go, mając nadzieję, że framework wypełni puste miejsca informacjami o lokalizacji).

Niestety, nie ma takiego szczęścia. Mimo że ta metoda zwraca adres URL do zapisanego obrazu, nadal nie mogę uzyskać informacji ALAssetPropertyLocation z to. Nawet jeśli używam wariantu orientacyjnego metody save, jest on bezużyteczny.

W tym momencie, myślę, że jedynym wyjściem wydaje się być zawierające własne informacje o lokalizacji, jak opisano tutaj .

Wydaje się nieco podejrzane, że musiałbym to zrobić, jednak, ponieważ spodziewałbym się, że framework zajmie się tym dla Ciebie automagicznie. W rzeczywistości, nie mogę nawet uzyskać informacji o lokalizacji wcześniej zrobione zdjęcia. Jest to ze wszystkimi uprawnieniami udzielonymi we wszystkich właściwe miejsca, bez względu na to, jakiego urządzenia używam, iPhone czy iPad. (Nawet aplikacja aparatu ma odpowiednie uprawnienia, FWIW.)

 1
Author: Joe D'Andrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:51