废话
今天这篇来记录一下地图SDK中非常重要的一个功能:出行路线规划。我相信高德地图使用最多的也就是这个功能了,当然,我们今天的内容可能还做不到高德地图那么丰富的效果,比如林志玲娇嫩的语音指引你,但我们可以先做一个核心的功能就是把路线先画出来。
简介
我们在规划路线时,主要考虑的是四种模式:
- 驾车模式
- 步行模式
- 公交模式
- 骑行模式
其实高德SDK里远远不止这四种模式,还有很多细分模式,比如不走高速、最少红绿灯、避免拥堵、多策略模式等等,道理是一样的,我们暂且忽略这些细分模式。
作为演示demo,我们也没必要每种模式都演示下,换汤不换药,我们只演示下驾车模式即可,驾车模式学会了,其它任何模式都是手到擒来。
1、添加Marker
为了显示出起点和终点,我们为起点和终点分别添加两个Marker。
private void addMarkers() {
LatLng start = new LatLng(startPoint.getLatitude(), startPoint.getLongitude());
aMap.addMarker(new MarkerOptions()
.position(start)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.start)));
LatLng end = new LatLng(endPoint.getLatitude(), endPoint.getLongitude());
aMap.addMarker(new MarkerOptions()
.position(end)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.end)));
}
2、路径规划
public void searchRoute() {
RouteSearch routeSearch = new RouteSearch(this);
routeSearch.setRouteSearchListener(listener);
RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
startPoint, endPoint);
RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(
fromAndTo, //路径规划的起点和终点
RouteSearch.DrivingDefault, //驾车模式
null, //途经点
null, //示避让区域
"" //避让道路
);
routeSearch.calculateDriveRouteAsyn(query);
}
在规划路径时,你可以选择性地添加途经点,比如你和朋友约好在一个地方捎上他,还可以添加避让区,比如你不想经过和前女友分手的地方,可以说还是很人性化的。
3、路径回调
规划的路径会通过onDriveRouteSearched方法返回,拿到返回数据后,我们就可以把路径绘制在地图上了。
这里先别急,我们看下回调的数据。
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
List<DrivePath> drivePathList = result.getPaths();
}
回调中我们通过result可以获得一个DrivePath的列表,为什么是一个列表呢?很简单,使用过高德地图的都知道,起点通往终点的,可能是多种路线方案,所以需要一个List来保存,那我们这里就取出第0个,接着往下看。
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
List<DrivePath> drivePathList = result.getPaths();
DrivePath drivePath = drivePathList.get(0);
List<DriveStep> steps = drivePath.getSteps();
}
DrivePath有一个方法getSteps(),它会返回一个DriveStep列表,为什么又是一个列表?因为一段路径可能是分成很多段的,每一段就是一个DriveStep,这个也不奇怪,使用过高德地图的都知道,转弯、掉头、换高速都是一段新的开始。OK,接着往下看。
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
List<DrivePath> drivePathList = result.getPaths();
DrivePath drivePath = drivePathList.get(0);
List<DriveStep> steps = drivePath.getSteps();
for (DriveStep step : steps) {
List<LatLonPoint> polyline = step.getPolyline();
}
}
遍历steps,调用DriveStep.getPolyline()方法可以获得一个List<LatLonPoint>,哦,到这里终于拿到我们想要的了,一个List<LatLonPoint>就可以描述一段路径,所有的DriveStep连起来就描述了整条规划路径。那么至此,我们理论上已经可以画出规划路径了。终于怎么画,就是用之前画线段的方法,这里就不细说了。
3、多色路径
路径虽然出来了,但是细心的朋友肯定发现了,这个路径并没有体现出道路的畅通状况,使用过高德地图的都知道,实时了解道路的畅通状况有利于我们选择恰当的路线,那怎么根据不同路段畅通状况绘制不同颜色呢,接着往下看。
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
List<DrivePath> drivePathList = result.getPaths();
DrivePath drivePath = drivePathList.get(0);
List<DriveStep> steps = drivePath.getSteps();
for (DriveStep step : steps) {
List<LatLonPoint> polyline = step.getPolyline();
List<TMC> tmcList = step.getTMCs();
for(TMC tmc : tmcList) {
String status = tmc.getStatus();
List<LatLonPoint> polyline1 = tmc.getPolyline();
}
}
}
step对象中还有一个List<TMC>,通过TMC我们可以获得status和List<LatLonPoint>,这个status就是这段路畅通状态的一个描述,它的取值只会是以下范围:
- “畅通”
- “缓行”
- “拥堵”
- “严重拥堵”
- “未知”
哦原来如此,结合下面的List<LatLonPoint>,我们就可以把每一段路程都对应上畅通状况,根据畅通状况选择不同的颜色,从而构建出一个颜色List,那么怎么把这个颜色List绘制在路径上呢?
List<Integer> colorList = new ArrayList<>();
PolylineOptions polylineOptions = new PolylineOptions();
polylineOptions.colorValues(colorList);
aMap.addPolyline(polylineOptions);
在构建PolylineOptions时,我们可以调用polylineOptions.colorValues(colorList);把颜色List设置进去,这样再调用aMap.addPolyline(polylineOptions)时,就会自动绘制出不同的颜色。
4、四种模式路径规划
OK,到这里我们基本理清了思路,既然驾车模式可以,其它任何一种模式当然也难不倒我们。下面演示下四种模式的路径规划,作为本节的结束。
总结
今天这篇我没有把全部的代码贴出来,一来是太多了,二来是觉得没必要,把思路理清楚是最重要的,没有明白原理,拿到源码也没意义。好吧,本期节目就到这里,感谢大家收看,我们下期再见~