対象:
Swift4

ジオコーディング(Swift)

ある地点の緯度、及び経度から住所等の馴染みのある情報を得る逆ジオコーディング(リバースジオコーディング)はCLGeocoderを使えば簡単にできる。CLGeocoderを使うためには、まずCoreLocationをimportする必要がある。

import CoreLocation

それからCLGeocoderのインスタンスを生成し、逆ジオコーディングしたい位置情報をCLLocationにしてreverseGeocodeLocationメソッドに渡してリクエストするだけである。reverseGeocodeLocationメソッドに渡すハンドラには、逆ジオコーディングされた結果がCLPlacemarkの配列として返されるので、その最初の要素を参照すれば良い。

        let geocoder = CLGeocoder()
        // 千葉駅
        let location = CLLocation(latitude: 35.613203, longitude: 140.113544)
        geocoder.reverseGeocodeLocation(location) { (placemarks, error) in
            if let placemarks = placemarks {
                if let pm = placemarks.first {
                    print("name: \(pm.name ?? "")")
                    print("isoCountryCode: \(pm.isoCountryCode ?? "")")
                    print("country: \(pm.country ?? "")")
                    print("postalCode: \(pm.postalCode ?? "")")
                    print("administrativeArea: \(pm.administrativeArea ?? "")")
                    print("subAdministrativeArea: \(pm.subAdministrativeArea ?? "")")
                    print("locality: \(pm.locality ?? "")")
                    print("subLocality: \(pm.subLocality ?? "")")
                    print("thoroughfare: \(pm.thoroughfare ?? "")")
                    print("subThoroughfare: \(pm.subThoroughfare ?? "")")
                    if let region = pm.region {
                        print("region: \(region)")
                    }
                    if let timeZone = pm.timeZone {
                        print("timeZone: \(timeZone)")
                    }
                    print("inlandWater: \(pm.inlandWater ?? "")")
                    print("ocean: \(pm.ocean ?? "")")
                    if let areasOfInterest = pm.areasOfInterest {
                        print("areasOfInterest: \(areasOfInterest)")
                    }
                }
            }
        }

これを実行した結果が以下になる。いくつか関東のランドマーク的な場所を逆ジオコーディングしてみたが、国内だとnameには"〒"付きの郵便番号しか返ってこないようだ。

name: 〒260-0031
isoCountryCode: JP
country: 日本
postalCode: 260-0031
administrativeArea: 千葉県
subAdministrativeArea: 
locality: 千葉市中央区
subLocality: 新千葉
thoroughfare: 新千葉1丁目
subThoroughfare: 1
region: CLCircularRegion (identifier:'<+35.61320300,+140.11354400> radius 70.87', center:<+35.61320300,+140.11354400>, radius:70.87m)
timeZone: Asia/Tokyo (current)
inlandWater: 
ocean: 

因みに、iOS 11以降はreverseGeocodeLocationメソッドでLocaleを指定できるようになったので、"en_US"を指定してApple Park辺りの座標を逆ジオコーディングすると、以下のような結果が得られた。nameには"Apple Park"が返ってきている。

        // Apple Park
        let location = CLLocation(latitude: 37.334902, longitude: -122.008872)
        // Localeでen_USを指定
        geocoder.reverseGeocodeLocation(location, preferredLocale: Locale(identifier: "en_US")) { (placemarks, error) in
            // 処理は同じ
        }
name: Apple Park
isoCountryCode: US
country: United States
postalCode: 95014
administrativeArea: CA
subAdministrativeArea: Santa Clara
locality: Cupertino
subLocality: Pruneridge Tantau
thoroughfare: 
subThoroughfare: 
region: CLCircularRegion (identifier:'<+37.33490199,-122.00887200> radius 141.73', center:<+37.33490199,-122.00887200>, radius:141.73m)
timeZone: America/Los_Angeles (fixed)
inlandWater: 
ocean: 
areasOfInterest: ["Apple Park"]
(2018/01/28)

新着情報
【オープンソースソフトウェア環境構築】Amazon S3にアクセスするSparkアプリケーション
【iOS Objective-C, Swift Tips】ジオコーディング(Swift)
【iOS Objective-C, Swift Tips】HTTP GETとPOST(Swift)

Copyright© 2004-2018 モバイル開発系(K) All rights reserved.
[Home]