ジオコーディングは住所から緯度、経度を取得しますが、リバースジオコーディングはその名の通り、緯度経度から住所を取得します。MapKit だけでこのリバースジオコーディングが提供されています。

リバースジオコーディングを使用するには MKReverseGeocoder を使います。MKReverseGeocoderDelegate の設定を忘れずに。

下記の例では、[iPhone] MapKit にアイコン画像でピンを立ててタップ可能にするで説明したバルーンのアクセサリをタップしたときに、そのアノテーションの住所をログに出力しています。

- (void) mapView:(MKMapView*)_mapView annotationView:(MKAnnotationView*)annotationView calloutAccessoryControlTapped:(UIControl*)control {
	CLLocationCoordinate2D coordinate = annotationView.annotation.coordinate;
	MKReverseGeocoder *reverseGeocoder;
	reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:coordinate];
	reverseGeocoder.delegate = self;
	[reverseGeocoder start];
}

- (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFindPlacemark:(MKPlacemark*)placemark {
    NSLog(@"title: %@", placemark.title);
}

- (void) reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError*) error {
    NSLog(@"error");
}

MKPlacemark のプロパティには色々あって、国名や県名などを個別に取得することができます。しかし、なぜか神奈川県横浜市西区のような住所の場合、「西区」が個別プロパティでは取得できません。東京23区などは個別プロパティでも全ての住所を取得できます。

MKPlacemark.h のプロパティは以下のようになっています。

@property (nonatomic, readonly) NSString *thoroughfare; // street address, eg 1 Infinite Loop
@property (nonatomic, readonly) NSString *subThoroughfare;
@property (nonatomic, readonly) NSString *locality; // city, eg. Cupertino
@property (nonatomic, readonly) NSString *subLocality; // neighborhood, landmark, common name, etc
@property (nonatomic, readonly) NSString *administrativeArea; // state, eg. CA
@property (nonatomic, readonly) NSString *subAdministrativeArea; // county, eg. Santa Clara
@property (nonatomic, readonly) NSString *postalCode; // zip code, eg 95014
@property (nonatomic, readonly) NSString *country; // eg. United States
@property (nonatomic, readonly) NSString *countryCode; // eg. US

しかしこれだと日本の住所は完全には取得できません。取得するには title プロパティを使用するか、MKPlacemark.addressDictionary.FormattedAddressLines から取得するしかないと思います。MKPlacemark.addressDictionary は AddressBook に使える NSDictionary です。これを利用して以下のようにして住所部分だけを取り出せます。

NSLog(@"%@", [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] objectAtIndex:1]);

ただ、これでも郵便番号が入ったり、入らなかったりするので、正規表現などで文字列を整形しないと全ての地点で同じ形式で住所が取得できないようです。

参考サイト
琴線探査: MKReverseGeocoderでより精度の高い住所情報はMKPlacemark.addressDictionaryにあった!

関連する投稿