iOS 百度地图-绘制行车路径

本篇博客讲述的是百度地图的路径绘制中遇到的坑.

现在百度地图是2.9以及以上版本的了, 2.9以下的版本在点击标注物的时候不能触发点击事件.用最新版的可以适配iOS9系统, 也不用在合成模拟器和真机公用的frameWork, 这样的话对于不会使用终端的同学可以省掉很大一部分时间.

博客前提, 路径经纬度的数据是根据后台传输过来的点, 绘制而成的行车路径.博主遇到的坑共有以下两点:
(1)官方的demo给的绘制路径的方法, 给自己了一种误导,所以当时纠结了好大一阵子.
(2)百度地图的点需要纠偏, 博主用的只是GPS的纠偏.原来找了很久没有找到哪个方法, 以为路径可以显示就OK了.最后才发现与安卓版本的路径形状一样但是位置缺有偏差, 后来在百度地图的技术论坛中找到.(建议有问题去技术论坛找人解决)

下面我们解决这两个问题:
[1]第一点,先处理掉点的纠偏.
//百度地图纠偏问题, 坐标点的转化
这个是自己封装的私有方法, 可以穿进去一个CLLocationCoordinate2D对象, 返回一个以及纠偏过的正确的CLLocationCoordinate2D对象.(因为我这边用到的是GPS, 所以是GPS的纠偏)
- (CLLocationCoordinate2D )coorsTransformCoor:(CLLocationCoordinate2D )coor {
NSDictionary *dicZone = BMKConvertBaiduCoorFrom(coor, BMK_COORDTYPE_GPS);
CLLocationCoordinate2D baiduCoorZone = BMKCoorDictionaryDecode(dicZone);
return baiduCoorZone;
}
然后就是整个数组的点解析的问题了, 整个数组的点解析, 一般传进来的数据是二维的数组, 或者数组包着字典(所以自己要根据情况去进行转化), 由于我这边自己的二维数组所以我就用数组的处理为例

//将数组的点一次性解析完, 加入bigbig数组里面, 可以减少路径规划的误差
for (int i = 0; i < _pointArr.count; i++) {
CLLocationCoordinate2D coor;
//此处的二维数组, 第一层是每一组点的数组, 第二层是我们需要取出的东西(自己看情况处理)
coor.latitude = [_pointArr[i][1] doubleValue];
coor.longitude = [[_pointArr[i] firstObject] doubleValue];
//然后用下面的点纠偏
coor = [self coorsTransformCoor:coor];
//此处可以将coor的将纬度结构体转化为NSNumber类型, 或者字符串存进新的小数组中.(数组中只能存储对象)
NSString *latitude = [NSString stringWithFormat:@”%lf”, coor.latitude];
NSString *longitude = [NSString stringWithFormat:@”%lf”, coor.longitude];
NSArray *smallArr = [NSArray arrayWithObjects:latitude, longitude, nil];
// //然后将小数组存进需要使用的数组中
if (!_bigbigArr) {
_bigbigArr = [NSMutableArray array];
}
//这样的话这个bigbig数组就可以在我们绘制路径的时候直接使用了.
[_bigbigArr addObject:smallArr];
}

[2]然后我们来处理掉路径的绘制问题.
首先百度给我们的demo, 很容易让我们联想到把一个个CLLocationCoordinate2D对象放入绘制折线的方法中, 所以这其实是刚开始很困惑的一点.话不多说代码解释:
//_pointArr是返回的经纬度的数组(bigbigArr数组用上面经纬度转化的方法, 将pointArr用for循环每个点都转化过之后的数组)

for (int i = 0; i < _pointArr.count - 1; i++) {
//两个点确定一条线段,后面[]里面的2是两个坐标点,确定起点和终点
CLLocationCoordinate2D coors[2] = {0};
//这是一小段折线起点的经纬度,根据你获取到的数据转化
coors[0].latitude = [[_bigbigArr[i] firstObject] doubleValue];
coors[0].longitude = [[_bigbigArr[i] lastObject] doubleValue];
//这是一小段折线终点的经纬度, 同样根据获取到的数据转化
coors[1].latitude = [[_bigbigArr[i + 1] firstObject] doubleValue];
coors[1].longitude = [[_bigbigArr[i + 1] lastObject] doubleValue];

//每两个点连接一条线
BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coors count:2];
//现在线以及绘制好了, 下面BMKPolyline对象才是绘制路线下面方法中的对象(这个方法是单一的一条一条折线链接的路段, 有时候地图缩放比例大的时候, 线段链接的不够和谐)
[self.mapView addOverlay:polyline];
//下面的数组testArr
//[self.testArr addObject:polyline];
}

上面说到,这样绘制线段, 有些地方因为解析的原因链接会出现偏差, 这样的话, 官方提供的有另外的方法.
将上述的最后一个添加折线的方法去掉, 然后将上面的testArr的数组注释打开.(最好给数组写上懒加载否则数组接收不了数据)用
[self.mapView addOverlays:self.testArr];
一次性就可以处理完路径.
就此已经处理完毕上述的问题.

有需求的话请留言, 下面博客可以肤浅的处理一下标注以及多个标注的显示事件, 以及点击标注区别不同的标注事件.(本篇博客比较细, 所以比较适合一些新手去看, 大神请飘走)

你可能感兴趣的:(百度地图,iOS)