ジオコーディングとリージョン
座標を住所に変換し、リージョンを監視します。
「ジオコーディングとリージョン」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
ジオコーディングとは
ジオコーディングは人間が読める住所を座標に変換し、逆ジオコーディングは座標を読みやすい住所に戻します。Core Locationには、Appleのサーバーと通信して両方を行うCLGeocoderが用意されています。
import CoreLocation
let geocoder = CLGeocoder()住所をフォワードジオコーディングする
自由形式の住所を指定してgeocodeAddressString(_:)を呼び出します。完了時にはCLPlacemarkオブジェクトの配列が返されるため、最初の要素を取得してそのlocationを読み取ります。
geocoder.geocodeAddressString("Eiffel Tower, Paris") { placemarks, error in
if let coord = placemarks?.first?.location?.coordinate {
print(coord.latitude, coord.longitude)
}
}座標を逆ジオコーディングする
CLLocationを指定すると、reverseGeocodeLocation(_:)はその地点を示すプレースマークを返します。プレースマークには、通り、市区町村、国、郵便番号などの情報が含まれます。
let loc = CLLocation(latitude: 48.8584, longitude: 2.2945)
geocoder.reverseGeocodeLocation(loc) { placemarks, error in
if let p = placemarks?.first {
print(p.name ?? "", p.locality ?? "", p.country ?? "")
}
}CLPlacemark構造体
CLPlacemarkには、name、thoroughfare(通り)、locality(市区町村)、administrativeArea(州または都道府県)、postalCode、country、isoCountryCodeなどの豊富なフィールドがあります。多くはオプショナルなので、慎重にアンラップしてください。
func format(_ p: CLPlacemark) -> String {
[p.thoroughfare, p.locality, p.country]
.compactMap { $0 }
.joined(separator: ", ")
}ジオコーダーの制限
CLGeocoderはネットワークベースで、リクエスト頻度が制限されています。一度に1つのリクエストだけを実行し、短い間隔でループしてリクエストを送ることは避けてください。結果が不要になったら、実行中の処理をcancelGeocode()でキャンセルします。
geocoder.cancelGeocode()Async/Await によるジオコーディング
最新の Swift では async 版が用意されているため、完了ハンドラーの代わりに try await を使って、処理の流れに沿ったコードを書けます。
func coordinate(for address: String) async throws -> CLLocationCoordinate2D? {
let placemarks = try await geocoder.geocodeAddressString(address)
return placemarks.first?.location?.coordinate
}リージョン監視の概要
リージョン監視(ジオフェンシング)を使うと、定義した円形の範囲にデバイスが入ったとき、または出たときに、アプリが実行されていなくてもシステムから通知を受け取れます。常にの認証が必要です。
// Requires NSLocationAlwaysAndWhenInUseUsageDescription
manager.requestAlwaysAuthorization()CLCircularRegion の定義
ジオフェンスは、中心、半径(メートル単位)、一意の識別子を持つ CLCircularRegion です。関心のあるイベントを選ぶには、notifyOnEntry と notifyOnExit を設定します。
let region = CLCircularRegion(
center: CLLocationCoordinate2D(latitude: 41.0, longitude: 29.0),
radius: 200,
identifier: "OfficeZone"
)
region.notifyOnEntry = true
region.notifyOnExit = trueリージョン監視の開始
startMonitoring(for:) を呼び出して監視を開始します。デバイスには上限(アプリあたり約 20 リージョン)があるため、その時点で最も重要なリージョンだけを監視してください。
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
manager.startMonitoring(for: region)
}入退出イベントの受信
境界を越えると、デリゲートメソッドの didEnterRegion と didExitRegion が呼び出されます。どのジオフェンスがトリガーになったかを知るには、リージョンの identifier を使います。
func locationManager(_ m: CLLocationManager, didEnterRegion region: CLRegion) {
print("Entered:", region.identifier)
}
func locationManager(_ m: CLLocationManager, didExitRegion region: CLRegion) {
print("Exited:", region.identifier)
}現在の状態の確認
境界を越えるのを待たずに、デバイスがすでにリージョン内にいるかどうかを確認するには、requestState(for:) を呼び出します。結果は didDetermineState に .inside、.outside、または .unknown として返されます。
manager.requestState(for: region)
func locationManager(_ m: CLLocationManager,
didDetermineState state: CLRegionState,
for region: CLRegion) {
print(region.identifier, state == .inside ? "inside" : "outside")
}クイックチェック:ジオコーディングとリージョン
理解度を確認しましょう。
まとめ:ジオコーディングとリージョン
住所と座標を相互に変換する方法と、地理的な境界を監視する方法を学びました。
CLGeocoderはフォワードジオコーディングとリバースジオコーディングを行います(async 版もあります)。ただし、利用回数に制限があります。CLPlacemarkには、すべてオプショナルの詳細な住所フィールドが格納されます。CLCircularRegionはジオフェンスを定義します。監視には「常に」の認証が必要です。didEnterRegion/didExitRegionを処理し、requestState(for:)で状態を確認します。
よくある質問
「ジオコーディングとリージョン」レッスンは無料ですか?
はい。「ジオコーディングとリージョン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「ジオコーディングとリージョン」で何を学びますか?
座標を住所に変換し、リージョンを監視します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ジオコーディングとリージョン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 位置情報の利用許可を求める
- ユーザーの位置情報を取得する
- SwiftUIで地図を表示する
- ジオコーディングとリージョン