Tag Archives: 百度地图

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

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

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...
?*/
????????????}];
????????}
????????// 结束
????}
}

[……]

继续阅读

百度地图经纬度与苹果地图经纬度之间的转换

在我们的项目中经常会用到百度地图这个第三方SDK,尤其是即有安卓版又有iOS版的项目,(如果只有单纯的iOS版App的项目我个人强烈建议使用苹果自带的地图,自从苹果引用高德地图为其系统自带地图后,地图及定位的使用已经非常方便了,封装得很好并且国内的服务器速度也非常快!)然后百度地图定位获取到的经纬度是不能直接与苹果自带的地图混用的,同样的经纬度在两个地图上标注显示的不是同一个地方,这样一来数据就会有偏差,如何使其两者很好的兼容呢?我们首先还是科普一下:

一、坐标体系

首先我们要明白,开发者能接触到哪些坐标体系呢?

第一种分类:
1、??GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度。
2、??GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。
3、??其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。

第二种分类:
首先明白,所有坐标体系的原点,都是非洲。
1、??经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。
2、??墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192)墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。搜狗地图API就是直接使用的墨卡托坐标。[……]

继续阅读

百度地图第七讲:路径规划

一、先看效果图:

iOS-模拟器屏幕快照“2014年11月20日-下午5.42.39”

二、实现步骤

1、创建基本视图(这一步可先跳过,直接在代码中写入需要传入的数据即可)
2、实现定位功能,这不是该Demo的核心,甚至可以去掉,具体做法可参照http://www.yusian.com/bbs/thread-8375-1-1.html
3、如何计算两地的路径并在地图上展现出来(重点)
3.1、创建两个点(BMKPlanNode类,如果是步行创建后给name及cityName赋值即可)
3.2、路径计算选项(步行、公交、自驾等),发起搜索
3.3、在代理方法中获取网络计算结果
3.4、处理计算结果(复杂的来了,做好准备!!)
3.4.1、如果是步行计算结果返回的是一个BMKWalkingRouteResult对象
3.4.2、该对象中有个结果为BMKWalkingRouteLine类型的数组,因为有可能会有多条线路
3.4.3、我们取第一条线路(数组中的第一个元素,一般最优的放在最前面)
3.4.4、该对象中有个结果为BMKWalkingStep类型的数组,一条线路中分为多个路段(因为会有岔路嘛)
3.4.5、我们取出所有的路段,每个路段都会有个入口信息与出口信息BMKRouteNode类型数据,这个可做为路径点标注使用
3.4.6、每个路段信息中包含了该路段的地理坐标集合:BMKMapPoint类型数据的组数,我们最终的目的就是为了取出这个数组中的所有元素;
3.4.7、BMKMapPoint数组是一个c语言数组,不能直接用oc的语法去处理,之所有要取出所有的这种类型数据是因为我们最终的路径是由这些点组成,然后再用折线将这些点连接成线!
3.4.8、小结一下,关键性的三个数组:路线–路段–路径点(BMKWalkingRouteLine–BMKWalkingStep–BMKMapPoint)
3.5、获取到所有的路径点之后,将这个数组传给绘图类BMKPolyline,让其绘出折线,其实所谓的路径曲线就是由很多条小段的折线组成。
3.6、通过mapView的代理方法,将折线展示到地图上,路径规划大功造成!

三、关键性代码示例[……]

继续阅读

百度地图使用第六讲:检索及大头针的使用

基本步骤:

1、创建地图视图;
2、使用定位的功能获取到当前位置;
3、利用检索功能,在当前位置检索某个关键字(如:酒吧);
4、利用检索到的结果,创建大头针并在地图上展示;

关键的类:

1、BMKMapView:地图
2、BMKLocationService:定位
3、BMKPoiSearch:POI检索(POI即Point Of Interest可以翻译为兴趣点)
4、BMKNearbySearchOption:周边搜索选项,配合POI检索使用,做为POI检索的数据模型
5、BMKPointAnnotation:大头针,可直接添加到地图上做为标注使用

关键方法:

#pragma mark 定位服务的代理方法,如果获取到位置信息则调用
– (void)didUpdateUserLocation:(BMKUserLocation *)userLocation
#pragma mark POI检索代理方法,如果检索到结果则调此方法
-(void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode
代码示例:[……]

继续阅读