0Pricing
Swift Academy · レッスン

ジオコーディングとリージョン

座標を住所に変換し、リージョンを監視します。

「ジオコーディングとリージョン」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 位置情報の利用許可を求める
  2. ユーザーの位置情報を取得する
  3. SwiftUIで地図を表示する
  4. ジオコーディングとリージョン
← Swift Academyに戻る