Извлечение данных GPS из фотографии

мне трудно, потому что я хочу извлечь координаты GPS из фотографии. Я использую функцию imagePickerController:didFinishPickingMediaWithInfo чтобы выбрать изображение, и я вставляю это изображение в collectionView с помощью новой рамки фотографий. Я хочу извлечь GPS координаты с фотографии. Я провел некоторое исследование, и я знаю, что UIImage не содержит всех метаданных, поэтому я попытался использовать AssetsLibrary основы. Внутри didFinishPickingMediaWithInfo Я использую следующий код для извлечения фото местонахождение:

    var referenceURL : NSURL = info.objectForKey(UIImagePickerControllerReferenceURL) as NSURL
    var library : ALAssetsLibrary = ALAssetsLibrary()
    library.assetForURL(referenceURL, resultBlock: { (asset : ALAsset!) -> Void in
        var rep : ALAssetRepresentation = asset.defaultRepresentation()
        var metadata : NSDictionary = rep.metadata()


        let location: AnyObject! = asset.valueForProperty(ALAssetPropertyLocation)
        if location != nil {
            println(location)
        }
        else
        {
            println("Location not found")
        }


         })
    {
            (error : NSError!) -> Void in
    }

однако он не находит местоположение, хотя я проверил изображение и содержит метаданные EXIF (он также содержит местоположения GPS, в которых я заинтересован). Как я могу получить координаты с фотографии?

4 ответов


ALAssetsLibrary устарел в iOS 10. К счастью, с Photo framework это тривиально реализовать. Когда imagePickerController(_ picker:, didFinishPickingMediaWithInfo) вызывается, вы можете получить информацию о местоположении с помощью простого поиска. Взгляните на код ниже:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
   if let URL = info[UIImagePickerControllerReferenceURL] as? URL {
       let opts = PHFetchOptions()
       opts.fetchLimit = 1
       let assets = PHAsset.fetchAssets(withALAssetURLs: [URL], options: opts)
       let asset = assets[0]
       // The location is "asset.location", as a CLLocation 

// ... Other stuff like dismiss omitted
}

надеюсь, что это помогает. Это Swift 3, Конечно..


Я нашел решение, используя следующий код:

 if picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary
    {
        if let currentLat = pickedLat as CLLocationDegrees?
        {
            self.latitude = pickedLat!
            self.longitude = pickedLong!
        }
        else
        {
        var library = ALAssetsLibrary()
        library.enumerateGroupsWithTypes(ALAssetsGroupAll, usingBlock: { (group, stop) -> Void in
                if (group != nil) {

                println("Group is not nil")
                println(group.valueForProperty(ALAssetsGroupPropertyName))
                group.enumerateAssetsUsingBlock { (asset, index, stop) in
                    if asset != nil
                    {
                    if let location: CLLocation = asset.valueForProperty(ALAssetPropertyLocation) as CLLocation!
                    { let lat = location.coordinate.latitude
                        let long = location.coordinate.longitude

                        self.latitude = lat
                        self.longitude = lat

                        println(lat)
                        println(long)
                        }
                    }
                }
            } else
                {
                println("The group is empty!")
                }
            })
            { (error) -> Void in
                println("problem loading albums: \(error)")
        }
    }
}

что это читает весь альбом и печать, если фото есть то свойство, то он печатает "местоположение не найдено". Он делает это для каждой фотографии в альбоме.Так что у меня есть еще один вопрос... Я хочу отобразить информацию о местоположении только для фотографии, которую я выбрал, а не для всего альбома. Кто-нибудь знает, как это можно сделать?


func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    if picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary {

        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        pickedImage.image = image

        let url = info[UIImagePickerControllerReferenceURL] as! NSURL
        let library = ALAssetsLibrary()          
        library.assetForURL(url, resultBlock: { (asset) in
            if let location = asset.valueForProperty(ALAssetPropertyLocation) as? CLLocation {

                self.latitude = location.coordinate.latitude
                self.longitude = location.coordinate.longitude
            }
            }, failureBlock: { (error: NSError!) in
                print("Error!")
        })
    }

    self.dismissViewControllerAnimated(true, completion: nil)
}

наконец-то удалось получить это, попробовав много разных способов, это замечательно плохо упоминается в документации apple (или я просто не мог найти его). К сожалению, любые изображения, которые не были приняты через приложение "Камера", как правило, не имеют метаданных местоположения. Но это прекрасно работает, когда они это делают.

получил ответ от https://stackoverflow.com/a/27556241/4337311


С iOS 11 все становится гораздо легче восстановить GPS координат изображения в вашей фото ролл.

сначала импортируйте фото SDK

import Photos

затем, прежде чем нажать UIImagePickerController, задать разрешение на доступ к данным :

if PHPhotoLibrary.authorizationStatus() == .notDetermined {
    PHPhotoLibrary.requestAuthorization { [weak self](_) in
        // Present the UIImagePickerController
        self?.present(picker, animated: true, completion: nil)
    }
}

затем, когда вы возвращаете изображение из UIImagePickerController, вам нужно только сделать следующее, чтобы захватить координаты:

let coordinate = (info[UIImagePickerControllerPHAsset] as? PHAsset)?.location?.coordinate