iOS 5.0 より追加された CLGeocoder を使用して逆ジオコーディング
Appleのドキュメントによると
iOS 5.0では、MKReverseGeocoderとMKReverseGeocoderDelegateは非推奨になっているの で、新たにアプリケーションを開発する場合はCLGeocoderを使ってください。
とのことなので、逆ジオコーディングを CLGeocoder を使用してやってみたのでその手順をこちらにメモしておきます。
(上記Appleのドキュメントのコードは少しずつ変数名が間違ってたり、独自定義のクラスが引数の型に指定されていたりして、そのままでは使いづらい・・・)
で、手順といってもヘッダのインポートやオブジェクトの生成とかを除けば、
- reverseGeocodeLocation:completionHandler: を呼ぶ
これしかありません・・・
僕の場合は下記のようにクラスメソッドを定義しました。
+ (void)reverseGeocodeLocation:(CLLocation *)location { CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder reverseGeocodeLocation:location completionHandler: ^(NSArray* placemarks, NSError* error) { if ([placemarks count] > 0) { CLPlacemark *placemark = (CLPlacemark *)[placemarks lastObject]; // 取得したplacemarkを格納したNSNotificationを発行 } }]; }
Blocksで非同期に処理されるので、CLPlacemarkオブジェクトを取得したらNSNotificationを発行して必要なオブジェクトに通知するようにしました。
なお、reverseGeocodeLocation:completionHandler: で得られる値が NSArray 型になっていますが、CLGeocoderのクラスリファレンスによると
Contains an array of CLPlacemark objects. For most geocoding requests, this array should contain only one entry. However, forward-geocoding requests may return multiple placemark objects in situations where the specified address could not be resolved to a single location.
とあり、逆ジオコーディングのときは基本的に1つしかオブジェクトが入ってこないと思ってよさそうです。(正ジオコーディングのときはアドレス→緯度経度なので、1つとは限らないため、NSArrayになっている)