マップの中心の緯度経度を取得したり、地名を取得したのですが、ジオコーディングってやっぱり記事は多くはないので、さくさくっとコピペで取得できるやつを載せます。笑
ジオコーディングってあまり使う機会がないけど、地図ってなんかワクワクするでございます
開発環境(前提条件)
・Xcode12.5
・Swift5
実装方法
緯度経度(CLLocation)から地域名を取得するのは CLGeocoder が提供してくれてます。
2021年5月12日の時点で、iOS14.5 では以下のコードで日本の住所が取得できます。
全地域を確認したわけではないので、例外はあるかも。
ざっくりフォーマットでいい場合
Apple が用意してくれてるフォーマットがあるので、それを利用しましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import CoreLocation import Contacts extension CLPlacemark { var formattedAddress: String? { guard let postalAddress = self.postalAddress else { return nil } return CNPostalAddressFormatter().string(from: postalAddress) } } |
取得できる文字列としては、都道府県〜番地まで丸ごとです。
住所をフルで使うだけならこのフォーマットで十分だと思います!
細かくフォーマットしたい場合
市区町村までを利用したい場合や番地がいらない場合など、細かくフォーマットしたい場合はちょいしんどいです。w
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
func getPlaceName(location: CLLocation, completion: @escaping ((String?) -> ())) { CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in if let firstPlacemark = placemarks?.first { var placeName = "" if let todohuken = firstPlacemark.administrativeArea { placeName.append(todohuken) } if let shikutyoson = firstPlacemark.locality { placeName.append(shikutyoson) } if let azaBanchi = firstPlacemark.thoroughfare { placeName.append(azaBanchi) } else if let aza = firstPlacemark.subLocality { placeName.append(aza) } if let banhchi = firstPlacemark.subThoroughfare { placeName.append(banhchi) } completion(placeName) } else { completion(nil) } } } |
administrativeArea って書かれても意味不明だと思うので、わかりやすいようオブジェクトの名前に都道府県や市区町村などを名付けました。笑
地名としては Apple のフォーマットと一緒になります!
地域名から緯度経度を取得するのも簡単です。
1 2 3 4 5 6 7 8 9 |
func getLocation(placeName: String, completion: @escaping ((CLLocation?) -> ())) { CLGeocoder().geocodeAddressString(placeName, completionHandler: { (placemarks, error) in if let firstPlacemark = placemarks?.first, let location = firstPlacemark.location { completion(location) } else { completion(nil) } }) } |
どちらにも言えますが、個人的に気をつけた方がいいなと思った点は以下の2つ。
・アプリごとにレート制限されているので、短時間で大量にリクエストしないような設計
・通信環境に影響されるので、取得〜完了までの UI/UX は考慮した方がいい
アプリによって様々な実装方法があると思うので、実装前にドキュメントを読んだ方が良さそう。
さいごに
ドキュメントってもっと探しやすくならないかな
めっちゃ奥深くまで探らないと分からない。笑
違うよ!とかこういう方法あるよ!ってのがあれば教えてください。
では( ¯·ω·¯ )
コメント