Извлечение данных 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