调用解析委托
MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:coo];
geocoder.delegate = self;
[geocoder start]; //调用委托 是异步调用 本函数结束后才会调用委托。
如果解析成功调用:
-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
NSString *sss = [placemark.addressDictionary objectForKey:@"FormatterAddressLines"];
if (sss) {
NSLog(@"sss = %@", sss);
} else {
//...
}
NSLog(@"countryCode=%@",placemark.countryCode);
NSLog(@"country=%@",placemark.country);
NSLog(@"administrativeArea=%@",placemark.administrativeArea);
NSLog(@"subAdministrativeArea=%@",placemark.subAdministrativeArea);
NSLog(@"locality=%@",placemark.locality);
NSLog(@"subLocality=%@",placemark.subLocality);
NSLog(@"thoroughfare=%@",placemark.thoroughfare);
NSLog(@"subThoroughfare=%@",placemark.subThoroughfare);
NSLog(@"postalCode=%@",placemark.postalCode);
NSString * addressResult = @"";
NSString * beijin=@"北京市";
NSString * shanghai=@"上海市";
NSString * tianjin=@"天津市";
NSString * chongqin=@"重庆市";
if ([placemark.administrativeArea isEqualToString:beijin] ||
[placemark.administrativeArea isEqualToString:shanghai] ||
[placemark.administrativeArea isEqualToString:tianjin] ||
[placemark.administrativeArea isEqualToString:chongqin] ) {
addressResult= placemark.locality;
} else {
//如果不是中国,那么加上国家名称
if(placemark.countryCode != @"CN") {
addressResult = [addressResult stringByAppendingString:placemark.country];
addressResult = [addressResult stringByAppendingString:@" "];
}
if([placemark.administrativeArea length] > 0) {
addressResult= [addressResult stringByAppendingString:@" "];
addressResult= [addressResult stringByAppendingString:placemark.administrativeArea];
//如果不是中国,那么各个段直接加上空格
if(placemark.countryCode != @"CN")
{
addressResult = [addressResult stringByAppendingString:@" "];
}
}
if([placemark.locality length] > 0) {
addressResult = [addressResult stringByAppendingString:placemark.locality];
//如果不是中国,那么各个段直接加上空格
if(placemark.countryCode != @"CN") {
addressResult = [addressResult stringByAppendingString:@" "];
}
}
}
if ([placemark.subLocality length]>0) {
addressResult = [addressResult stringByAppendingString:placemark.subLocality];
//如果不是中国,那么各个段直接加上空格
if(placemark.countryCode != @"CN") {
addressResult = [addressResult stringByAppendingString:@" "];
}
}
if ([placemark.thoroughfare length]>0) {
addressResult = [addressResult stringByAppendingString:placemark.thoroughfare];
//如果不是中国,那么各个段直接加上空格
if(placemark.countryCode != @"CN") {
addressResult = [addressResult stringByAppendingString:@" "];
}
}
if ([placemark.subThoroughfare length] > 0) {
addressResult= [addressResult stringByAppendingString:@" "];
addressResult = [addressResult stringByAppendingString:placemark.subThoroughfare];
}
NSLog(@" addressResult= %@",addressResult);
self.userLongPressAddress = addressResult;
NSLog(@"userLongPressAddress = %@", userLongPressAddress);
//因为解析是异步的,所以为了保证大头针再解析后生成,逻辑放到解析之后。
MapAnnotation *ann = [[MapAnnotation alloc]initWitchCoordinate:geocoder.coordinate];
ann.title = @"已放置的大头针";
NSLog(@"解析出的地址:%@", userLongPressAddress);
ann.subtitle = userLongPressAddress;
[myMapView addAnnotation:ann];
[ann release]; //解析出来的地址放到大头针的子标题
return;
}
如果解析失败 调用
-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog(@"逆向地理解析失败");
self.userLongPressAddress = @"地址解析失败!!!";
//因为解析是异步的,所以为了保证大头针再解析后生成,逻辑放到解析之后。
MapAnnotation *ann = [[MapAnnotation alloc]initWitchCoordinate:geocoder.coordinate];
ann.title = @"已放置的大头针";
NSLog(@"解析出的地址:%@", userLongPressAddress);
ann.subtitle = userLongPressAddress;
[myMapView addAnnotation:ann];
[ann release];
[geocoder release];
}
代码参考:http://blog.youkuaiyun.com/tangaowen/article/details/6527907 谢谢这位博主。
注意事项:逆向地址解析是异步的,当 start接口调用的时候,解析函数并不马上运行,所以如果在调用解析的逻辑后面立刻取解析结果,是肯定会取到错误值的。
取解析结果的操作一定要在解析函数执行结束才能使用。
至于解析什么时候执行,就要看ios自己的线程调度算法了,一般来说十几毫秒会切换一次线程,或者一个线程执行完毕就会执行其他优先级高的线程,作为使用者,不需要精确地知道什么时候,只要在确定解析执行之后再添加自己的逻辑就行了。
另外,解析操作大部分时候是失败的!所以只能作为辅助业务,目前还不可能作为一个精确度高的功能点。