我们在使用百度地图定位成功后,一般会使用反地理编码的方式进行地址解析,获取地址信息供我们应用使用,如下方法所示:
[Objective-C] 纯文本查看 复制代码 // 获取地址位置后调用方法
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
/*
code for location...
*/
// 反地址编码获取地址
BMKReverseGeoCodeOption *option = [[BMKReverseGeoCodeOption alloc] init];
option.reverseGeoPoint = userLocation.location.coordinate;
SALog(@"开始反地理编码...");
if (![self.geoCode reverseGeoCode:option]){
SALog(@"反地址编码失败,使用Apple地图反地理编码");
CLLocationCoordinate2D newCoor = [[self class] GCJ02FromBD09:userLocation.location.coordinate];
CLLocation *location = [[CLLocation alloc] initWithLatitude:newCoor.latitude longitude:newCoor.longitude];
[[[CLGeocoder alloc] init] reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks firstObject];
SALog(@"%@ - %@", placemark.name, placemark.locality);
/*
code for address...
*/
}];
}
// 结束
}
}
但是,Apple的反地址编码使用的经纬度与百度经纬度坐标是不一致的,所以需要转换,这里给一个转换的方法:
[Objective-C] 纯文本查看 复制代码 /// 百度坐标转高德坐标
+ (CLLocationCoordinate2D)GCJ02FromBD09:(CLLocationCoordinate2D)coor
{
CLLocationDegrees x_pi = 3.14159265358979324 * 3000.0 / 180.0;
CLLocationDegrees x = coor.longitude - 0.0065, y = coor.latitude - 0.006;
CLLocationDegrees z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
CLLocationDegrees theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
CLLocationDegrees gg_lon = z * cos(theta);
CLLocationDegrees gg_lat = z * sin(theta);
return CLLocationCoordinate2DMake(gg_lat, gg_lon);
}
关于百度地图经纬度与苹果自带地图经纬的故事,请参考这里:http://yusian.com/thread-10519-1-1.html
|