質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2318閲覧

phAssetを使った位置情報の取得

AppDvl

総合スコア58

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/08/01 07:32

編集2020/08/02 01:33

カメラロールで写真を選択し、その写真の位置情報を取得したい。
パソコンで言うとこの写真を右クリックしてプロパティにある緯度、経度の座標です。
パソコンでは緯度経度が確認できるので写真に記録さている座標をプログラムに使いたい。

しかし、print("info[.phAsset] as? URL",info[.phAsset] as? URL)でnilとなる。
ここのサイトを参考にし、同じようにしているのになぜnilとなるのでしょうか?
https://cpoint-lab.co.jp/article/202004/14791/
写真の中の位置情報の取得方法を教えていただきたいです。

写真を取得するとところまでは出来ています。
よろしくお願いします。

追記
print("info[.mediaMetadata]",info[.mediaMetadata])でもnilとなる。
print("info[.originalImage]",info[.originalImage])は Optional(<UIImage:0x28320cea0 anonymous {4032, 3024}>) と表示され取得できている。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { print("info[.phAsset] as? URL",info[.phAsset] as? URL) if let assetURL = info[.phAsset] 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 } print("latitude",longitude,"latitude",longitude) } }) } } }

イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、前提条件として Info.plist

Privacy - Photo Library Usage Description

を設定し、フォトライブラリに対し適切なアクセス条件を与えていると仮定します(アクセス許可がなければ、コードは正しくともinfo[.phAsset]の結果は nil となるため)。

まず、

Swift

1 print("info[.phAsset] as? URL",info[.phAsset] as? URL)

この部分ですが、キャストしている型が間違っていませんでしょか。

.phAssetであれば、PHAssetでキャストする必要があるかと思います。

また、info[.phAsset]で情報を取得すれば、その後の処理も少し変わってくるようです。

例えば、このような感じで緯度経度の情報を取得することができました。

Swift

1func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 2 print("info[.phAsset] as? PHAsset",info[.phAsset] as? PHAsset) 3 4 if let asset = info[.phAsset] as? PHAsset { 5 asset.requestContentEditingInput(with: nil, completionHandler: { contentEditingInput, info in 6 let url = contentEditingInput?.fullSizeImageURL 7 let inputImage = CIImage(contentsOf: url!)! 8 // CIImage から画像のメタデータのGPSを取得する 9 if inputImage.properties["{GPS}"] as? Dictionary<String,Any> == nil { 10 // GPS 情報の取得に失敗した時の処理 11 print("GPS Faild") 12 } else { 13 // GPS 情報の取得に成功した時の処理 14 let gps = inputImage.properties["{GPS}"] as? Dictionary<String,Any> 15 var latitude = gps!["Latitude"] as! Double 16 let latitudeRef = gps!["LatitudeRef"] as! String 17 var longitude = gps!["Longitude"] as! Double 18 let longitudeRef = gps!["LongitudeRef"] as! String 19 if latitudeRef == "S" { 20 latitude = latitude * -1 21 } 22 if longitudeRef == "W" { 23 longitude = longitude * -1 24 } 25 print("latitude",longitude,"latitude",longitude) 26 } 27 }) 28 } 29 }

許可について

たとえば、ViewDidLoad()あたりに下記のようなコードを追加して、初回起動時に認証をするように変更してみたらいかがでしょうか。

Swift

1 let status = PHPhotoLibrary.authorizationStatus() 2 3 if status == .notDetermined { 4 PHPhotoLibrary.requestAuthorization({status in 5 6 }) 7 }

投稿2020/08/01 12:59

編集2020/08/02 02:52
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AppDvl

2020/08/02 01:39

TsukubaDepotさん 回答ありがとうございます。 ご指摘のとうり修正して実行しましたが info[.phAsset] as? PHAsset nil となります。 エラーなどは出ていないためInfo.plistの設定に問題があるのかもしれません。 自分で何度も確認しましたが何が悪いのかわかりません。 画像を追加していますので、ご足労ですが照査していただけますか? 相変わらず、写真は参照できるのに緯度経度は参照できていません。
TsukubaDepot

2020/08/02 02:52

みた感じ、Info.plist の設定は間違っていないかと思います。 認証のためのコードを回答本文に追加してみましたので、これを追加した上で再度試してみてもらえますでしょうか。
AppDvl

2020/08/02 03:58

Info.plist の設定だけではダメだったんですね。認証の部分を記述したらアッサリ緯度経度が取得できました。最後までお付き合いし解決してくださってありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問