继续我们的百度地图之旅,这篇我将要介绍百度地图中路线规划,逆地理编码的应用,这也是百度地图最后一篇。虽然百度的其他功能自己也用过,但是项目中使用的较少,暂且不谈,因为要把百度地图的所有功能都说一边那是不可能的事。
路径搜索以步行搜索为例。
RoutePlanSearch:路径搜索的关键类,发起不同类型的路线规划
WalkingRoutePlanOption:步行路径规划参数类
OnGetRoutePlanResultListener:路线结果回调
路线规划的执行方法如下:
public static void routPlan(OnGetRoutePlanResultListener listener,RoutePlanSearch mSearch,LatLng stLatLng,LatLng endLatLng){
//传入开始节点
PlanNode stNode = PlanNode.withLocation(stLatLng);
//传入结束节点
PlanNode enNode = PlanNode.withLocation(endLatLng);
//获取搜索实例
mSearch = RoutePlanSearch.newInstance();
//注册监听回调
mSearch.setOnGetRoutePlanResultListener(listener);
//执行步行路线检索
mSearch.walkingSearch((new WalkingRoutePlanOption())
.from(stNode)
.to(enNode));
}
路线回调之后就将路线显示到地图上,路线回调的时候要分清这几件事,第一路线规划回调的不只是一条路线,第二,路线规划要在地图上显示要利用overlay,本质上就是路线规划回多个位置点,然后在每个点上添加overlay,路线其实就是overlay的集合。
OverlayManager:这个是官方demo封装的overlay管理的基类,这个类中有overlay添加到地图,移除地图,将overlay显示到可视范围内的方法。
/**
* 缩放地图,使所有Overlay都在合适的视野
* 注: 该方法只对Marker类型的overlay有效
*
*/
public void zoomToSpan() {
if (mBaiduMap == null) {
return;
}
if (mOverlayList.size() > 0) {
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Overlay overlay : mOverlayList) {
// polyline 中的点可能太多,只按marker 缩放
if (overlay instanceof Marker) {
builder.include(((Marker) overlay).getPosition());
}
}
mBaiduMap.setMapStatus(MapStatusUpdateFactory
.newLatLngBounds(builder.build()));
}
}
因为这个方法只对marker类型的overlay有效,所以也说明了路线本质上是一系列的marker点。
WalkingRouteOverlay:这个类继承了OverlayManager是填充数据的类,实现了OverlayManager抽象出getOverlayOptions()方法,这个方法在调用OverlayManager的addToMap()方法时将获取到的OverlayOptions进行了遍历。
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
route = result.getRouteLines().get(0);
overlay = new MyWalkingRouteOverlay(baiduMap);
overlay.setLineColor(Color.argb(178, 0, 78, 255));
overlay.setIsAddIcon(true);
overlay.setData(result.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
}
在路线回调里添加这个方法就可以实现将路线添加到地图上,百度地图支持将多条路线在地图上共同显示,只需要多调用几次获取实例的方法就可以了,还有在获取实例的时候尽量不要放到activity的oncreate()方法里,放在地图加载完成之后,这样更安全些。
逆地理编码
GeoCoder:地理编码查询接口
GeoCodeOption:地理编码请求
ReverseGeoCodeOption:反地理编码请求
OnGetGeoCoderResultListener:请求结果回调
第一步:
//获取地理编码查询实例
GeoCoder geoCoder = GeoCoder.newInstance();
//设置回调监听
geoCoder.setOnGetGeoCodeResultListener(this);
第二步:
LatLng center = mapStatus.bound.getCenter();
// 反Geo搜索
geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
.location(center))
第三步:
//地理信息转化为坐标的回调
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
}
//坐标转化为位置信息的回调
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
finalLng = result.getLocation().longitude;
finalLat = result.getLocation().latitude;
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
showshortToast("抱歉,未能找到结果");
return;
}
mtv_pointName.setText(result.getAddress());
}
计算两个经纬度的距离:
//计算p1、p2两点之间的直线距离,单位:米
DistanceUtil. getDistance(p1, p2);
以上就包含了一般项目中常用的操作了,至于百度导航,我认为很少应用会用到,建议使用定位的跟随模式+路线规划实现。这只是建议,根据需求选择自己适合的功能集成就好。