|  | 
 
 
 楼主|
发表于 2012-12-23 01:08:58
|
显示全部楼层 
| 2、获取地理位置信息 当你取到了一个经纬度信息时,也许还有这样的一个需求,那就是当前的经纬度所对应的地理位置信息是什么。那么这时候我们需要用到框架来为我们实现这一功能,那就是MapKit.framework。在这个框架中有一个叫MKReverseGeocoder的类可以帮助我们实现反向解析地理位置。请看一下代码:
 上面的代码是在获取到经纬度后,立刻进行反向地理位置解析的。其实MKReverseGeocoder用法也比较简单,通过经纬度初始化后直接调用start方法就可以实现反向解析了,然后等待返回,其返回是通过委托形式通知的。所以委托对象必须实现MKReverseGeocoderDelegate委托。解析成功后会返回一个MKPlacemark的对象里面包含了相关的地理位置信息(包括国家、地区、街道等)。复制代码-  (void)locationManager:(CLLocationManager *)manager 
     didUpdateToLocation:(CLLocation *)newLocation 
            fromLocation:(CLLocation *)oldLocation
 {
     MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];     
    geocoder.delegate = self;     
    [geocoder start];
 }
 
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder 
       didFindPlacemark:(MKPlacemark *)placemark
 {
      NSLog(@"\n country:%@\n postalCode:%@\n ISOcountryCode:%@\n locality:%@\n subLocality:%@\n administrativeArea:%@\n subAdministrativeArea:%@\n thoroughfare:%@\n subThoroughfare:%@\n",
            placemark.country,           
           placemark.postalCode,           
           placemark.ISOcountryCode,           
           placemark.administrativeArea,            
            placemark.subAdministrativeArea,           
           placemark.locality,           
           placemark.subLocality,           
           placemark.thoroughfare,
            placemark.subThoroughfare); 
}  
 
-  (void)reverseGeocoder:(MKReverseGeocoder *)geocoder 
        didFailWithError:(NSError *)error
 {     
    NSLog(@"reverse geocoder fail!!"); 
}
但从iOS5之后MKReverseGeocoder成为了不推荐使用的类。因此有一个新的类取代了他的作用,那就是CLGeocoder类,使用该类进行反向解析也非常容易,请看下面代码:
 从代码来看,CLGeocoder类没有使用委托的形式通知返回状态,而是通过block的方式进行回调,而且MKReverseGeocoder委托只返回了一个地标位置,但是CLGeocoder则返回了一个包含多个地标位置的数组,但这个数组在通常状态下是只有一个元素,如果存在多个元素那证明了给定解析的经纬度被解析到多个不同的地标信息。如果解析错误或者调用cancel方法则此参数为nil。复制代码CLGeocoder *geocoder=[[CLGeocoder alloc] init];
 [geocoder reverseGeocodeLocation:newLocation                     
               completionHandler:^(NSArray *placemarks,
                                    NSError *error)
                {                        
                        CLPlacemark *placemark=[placemarks objectAtIndex:0];            
                        NSLog(@"name:%@\n country:%@\n postalCode:%@\n ISOcountryCode:%@\n ocean:%@\n inlandWater:%@\n locality:%@\n subLocality:%@
 \n administrativeArea:%@\n subAdministrativeArea:%@\n thoroughfare:%@\n subThoroughfare:%@\n",
                               placemark.name,
                               placemark.country,
                               placemark.postalCode,
                               placemark.ISOcountryCode,
                               placemark.ocean,
                               placemark.inlandWater,
                               placemark.administrativeArea,
                               placemark.subAdministrativeArea,
                               placemark.locality,
                               placemark.subLocality,
                               placemark.thoroughfare,
                               placemark.subThoroughfare);
               }];
 
 
 | 
 |