ちょっと手こずったので、備忘録としてまとめ。
タイトル通り、Swift で写真の Exif
情報から緯度・経度を取得する方法です。
今回参考にさせていただいた記事はこちらから。
[Swift]imagePickerControllerで写真のexif情報(位置情報)を取得するサンプル – Qiita
https://qiita.com/kuyaahuchi/items/6be23a92f0d495d1b615【iOS】画像選択系UIを作る上で必要な知識 – Cybozu Inside Out | サイボウズエンジニアのブログ
https://blog.cybozu.io/entry/2019/03/18/163000
実装には UIImagePickerController
と Photos.framework
を使用しました。
画像選択の処理は割愛しまして、画像をアルバムから選択した後の処理がこちらです。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let assetURL = info[.referenceURL] as? URL { let result = PHAsset.fetchAssets(withALAssetURLs: [assetURL], options: nil) let asset = result.firstObject if let asset = asset { asset.requestContentEditingInput(with: nil, completionHandler: { contentEditingInput, info in let url = contentEditingInput?.fullSizeImageURL let inputImage = CIImage(contentsOf: url!)! // CIImage から画像のメタデータのGPSを取得する if inputImage.properties["{GPS}"] as? Dictionary<String,Any> == nil { // GPS 情報の取得に失敗した時の処理 print("GPS Faild") } else { // GPS 情報の取得に成功した時の処理 let gps = inputImage.properties["{GPS}"] as? Dictionary<String,Any> var latitude = gps!["Latitude"] as! Double let latitudeRef = gps!["LatitudeRef"] as! String var longitude = gps!["Longitude"] as! Double let longitudeRef = gps!["LongitudeRef"] as! String if latitudeRef == "S" { latitude = latitude * -1 } if longitudeRef == "W" { longitude = longitude * -1 } } }) } } }
アルバムから写真を選択すると上記の didFinishPickingMediaWithInfo
の関数が呼び出されますので、こちらに処理を記述していきます。
こちらのコードは 1つ目の参考記事に掲載されていたコードをほとんどコピー&ペーストさせていただきました。
ですが、2行目の assetURL
の取得については、そのままの書き方では動作しませんでしたので、2つ目の記事を参考に変更しました。
具体的な変更がこちら。
// 変更前 let assetURL = info[UIImagePickerControllerReferenceURL] as! URL // 変更後 let assetURL = info[.referenceURL] as? URL
…見た感じ、取得しようとしているデータは同じに見えます。
書き方が変わったのでしょうか?
実装するコードは以上です。
こちらを実機で実行したところ、写真を撮影した時の緯度・経度が取得できました!
なお、当然ながら Exif 情報内に緯度・経度が含まれていないと取得に失敗します。
その場合は、そのメッセージを表示するか、もしくは CoreLocation
フレームワークを使って、現在位置を取得処理を追加するのがいいと思います。
その辺りの処理については、アプリの仕様に合わせて変更してください。
以上、Swift で写真の Exif 情報から緯度・経度を取得する方法でした。
ご参考になれば幸いです。