2014-11-05 4 views
6

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

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 местоположения, в котором меня интересует). Как получить координаты с фото?

ответ

6

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

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)") 
     } 
    } 
} 

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

+0

Имея ту же проблему, удалось ли вам найти исправление? – TimWhiting

4
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) 
} 

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

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

+0

Привет, Тим, только что наткнулся на ваш вопрос. Код, который вы предоставили, похож на тот, который я использовал, используя URL-адрес изображения, а затем я написал блок результатов следующим образом: var resultBlock: ALAssetsLibraryAssetForURLResultBlock = {(myAsset: ALAsset!) -> Пустота} Затем после 'in' вы получить полные метаданные и получить доступ к интересующим вас свойствам. – Cristian

+0

Привет, христианин, я добавил ответ, потому что вы ответили в своем собственном ответе на вопрос, как просто получить метаданные отдельного изображения, а не весь альбом. Рад, что вы попали туда, в конце концов, все равно – TimWhiting

+1

это работает только для изображений, которые есть в PhotoLibrary. Что относительно камеры – hussain

8

ALAssetsLibrary является устаревшим в прошивке 10. К счастью, с фотографиями рамкой, это просто реализовать. Когда вызывается 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, конечно.

+0

Вы пробовали это при использовании камеры? Когда я пытаюсь получить доступ к 'info [UIImagePickerControllerReferenceURL] как? URL-адрес всегда возвращается. Требования к диспетчеру местоположения выполняются в файле Info.plist и запрашивают у пользователя доступ к их местоположению при использовании. Он все еще всегда возвращается. –

+0

Можете ли вы дать код с примером –

+0

@MattLong да, я сделал, и он отлично работает. Посмотрите на https://gist.github.com/sumitlni/6421aece205ebefa647abe701d2429e0 для gist - это ViewController, который вы можете встроить в пример приложения, чтобы увидеть код в действии. Это было успешно протестировано на устройстве. – LNI

Смежные вопросы