项目中集成的百度地图需要使用到路径规划这个功能,并且可以跳转第三方地图软件进行导航。调用第三方地图进行导航另一篇文章有写,这篇文章主要记录一下使用路径规划中遇到的坑。
前言
百度路径规划开发文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/route/drive
要使用百度地图路径规划前,先确保下载百度地图SDK时勾选了检索功能模块和定位模块,不然路径规划功所用到的一些类会找不到。
先讲一下项目中路径规划的逻辑,因为路径规划需要起点和终点的地理坐标,终点的坐标由后端提供,我这里只需要调用定位,确定当前所处地理位置坐标为起点就好。
实战
按照惯例先看官方文档
尼玛。。。佛系文档,看不看的懂随缘。
结合文档和百度,一点点写下来发现不对劲,为什么DrivingRouteOverlay这个类找不到,我下载SDK的时候明明已经勾选完需要的模块了,于是我从新下载了一遍SDK,替换掉项目中的,结果依然是没有。得了,作为一个伪资深程序员,直觉告诉我——有事没事找DEMO。果不其然,这个类就在DEMO里,你把老子好一顿找啊。把要用到的几个类考到自己项目中,就可以正常使用了。
现在跟着官方文档的步骤再一步步开发
1、创建驾车线路规划检索实例;
//初始化路径规划
mPlanSearch = RoutePlanSearch.newInstance();
2、创建驾车线路规划检索监听者;
我的项目中只需用到驾车路径规划,如果需要其他路径规划的,记得把所需要的类先从官方demo中拷贝过来,再分别实现方法就好了
/**
* 路径规划结果返回接口
*/
private OnGetRoutePlanResultListener mPlanResultListener = new OnGetRoutePlanResultListener() {
//步行路线
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
}
//公交路线
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
//轨道交通路线
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
}
//驾车路线
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
T.show(mContext, "抱歉,未找到结果");
}
if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
// result.getSuggestAddrInfo()
return;
}
if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
if (drivingRouteResult.getRouteLines().size() >= 1) {
DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
// mBaiduMap.setOnMarkerClickListener(overlay);
overlay.setData(drivingRouteResult.getRouteLines().get(0));//设置路线数据
overlay.addToMap();//将所有overlay添加到地图中
overlay.zoomToSpan();//缩放地图
} else {
T.show(mContext, "暂无路径规划");
}
}
}
//室内路线
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
}
//骑行路线
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
};
3、设置驾车线路规划检索监听者;
mPlanSearch.setOnGetRoutePlanResultListener(mPlanResultListener);
4、准备检索起、终点信息;
5、发起驾车线路规划检索;
//定位当前位置后在进行路径规划
mPlanSearchLocationClient = LocalAddrUtil.getLocalAddr(app, new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
dismissLoading();
mPlanSearchLocationClient.stop();
mStartLat = bdLocation.getLatitude();
mstartLng = bdLocation.getLongitude();
PlanNode starNode = PlanNode.withLocation(new LatLng(mStartLat, mstartLng));
PlanNode endNode = PlanNode.withLocation(new LatLng(mLat, mLng));
//开启路径规划检索
mPlanSearch.drivingSearch(new DrivingRoutePlanOption().from(starNode).to(endNode));
}
});
6、释放检索实例;
mPlanSearch.destroy();
到此集成完毕,本以为可以开开心心的使用路径规划,结果运行报错,mmp,一看log发现是资源报错,发现是拷贝过来的类有问题,检查一番,错出在这里
BitmapDescriptorFactor
.fromAssetWithDpi("Icon_line_node.png")
因为路径规划需要用到一些资源图片,比如起终点的小图标。
解决办法,1、从官方DEMO中把那些资源拷贝过来。2、替换为自己项目中的资源。
总结
集成百度地图的过程中我发现,百度不仅给用户挖坑,开发也不放过啊!