Takahiro Octopress Blog

-1から始める情弱プログラミング

CLGeocoderによるジオコーディングについて

ジオコーディング/逆ジオコーディングについて

本日は、CoreLocation.frameworkによる ジオコーディング について書きたいと思います。まず、 ジオコーディング とは住所を緯度・経度に変換する技術のことです。逆に緯度・経度を住所に変換する技術を 逆ジオコーディング と言います。

ジオコーディングは多くのサービスで利用されていることと思いますが、大抵の場合、GoogleやYahooのジオコーディングAPIを利用しているのではないでしょうか?
ですが、冒頭でも述べたようにあえてCoreLocation.frameworkによるジオコーディング/逆ジオコーディングについて見てみたいと思います。

CoreLocation.frameworkでのジオコーディング/逆ジオコーディング方法

早速、説明していきます。
ジオコーディング/逆ジオコーディングのためのメソッドはCLGeocoderクラスの中に含まれています。
下記のように使います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// ジオコーディング処理(住所を緯度・経度に変換)
func geocode(address:String) {
  let geocoder = CLGeocoder()
  geocoder.geocodeAddressString(address) { (placeMarks:[CLPlacemark]?, error:NSError?) -> Void in
      for placeMark in placeMarks! {
          print("latitude: \(placeMark.location?.coordinate.latitude), longitude: \(placeMark.location?.coordinate.longitude)")
      }
  }
}

// 逆ジオコーディング処理(緯度・経度を住所に変換)
func reverseGeocode(latitude:CLLocationDegrees, longitude:CLLocationDegrees) {
  let location = CLLocation(latitude: latitude, longitude: longitude)
  let geocoder = CLGeocoder()
  geocoder.reverseGeocodeLocation(location) { (placeMarks:[CLPlacemark]?, error:NSError?) -> Void in
      let placeMark = placeMarks?.first
      if let country = placeMark?.country {
          print("\(country)")
      }
      if let administrativeArea = placeMark?.administrativeArea {
          print("\(administrativeArea)")
      }
      if let subAdministrativeArea = placeMark?.subAdministrativeArea {
          print("\(subAdministrativeArea)")
      }
      if let locality = placeMark?.locality {
          print("\(locality)")
      }
      if let subLocality = placeMark?.subLocality {
          print("\(subLocality)")
      }
      if let thoroughfare = placeMark?.thoroughfare {
          print("\(thoroughfare)")
      }
      if let subThoroughfare = placeMark?.subThoroughfare {
          print("\(subThoroughfare)")
      }
  }
}

今回は簡単なサンプルなので、ログ出力のみにしています。
実に簡単ですね!
逆ジオコーディングの場合、全ての値が入った上でplaceMarkが返されるわけではないので、思い描いた住所が出ない場合もありました。

CoreLocation.frameworkでの逆ジオコーディングの精度

では、このCoreLocation.frameworkによる逆ジオコーディングって、どの程度正確なんでしょうか?
Googleが公開している逆ジオコーディングAPIはhttps://maps.googleapis.com/maps/api/geocode/json?latlng=<緯度>,<経度>&sensor=falseです。
筆者が自宅で実機で実際に取得した位置情報を逆ジオコーディングして試したところ、Google APIの結果と必ず一致するわけではありませんでした。

どちらが正しかったかというと、正直なところ、Google APIの方が精度が高かったです。
これがあまり逆ジオコーディングの方法としてCoreLocation.frameworkが使われない理由なのかもしれません。
Appleはどんどんマップの精度向上に力を入れていますし、いつの日か、Googleと遜色のない結果が返ってくるかもしれません。

と言ったところで本日はここまで。

Comments