【Swift】写真のExif情報から緯度・経度を取得する方法

ちょっと手こずったので、備忘録としてまとめ。
タイトル通り、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

 

実装には UIImagePickerControllerPhotos.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 情報から緯度・経度を取得する方法でした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG