如何解决百度地图反地理编码失败的问题!!

我们在使用百度地图定位成功后,一般会使用反地理编码的方式进行地址解析,获取地址信息供我们应用使用,如下方法所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 获取地址位置后调用方法
- (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的反地址编码使用的经纬度与百度经纬度坐标是不一致的,所以需要转换,这里给一个转换的方法:

1
2
3
4
5
6
7
8
9
10
11
/// 百度坐标转高德坐标
+ (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);
}

关于百度地图经纬度与苹果自带地图经纬的故事,请参考:百度地图经纬度与苹果地图经纬度之间的转换

Leave a Reply