前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android高德之旅(17)出行路线规划废话简介总结

Android高德之旅(17)出行路线规划废话简介总结

作者头像
大公爵
发布2018-09-05 17:19:00
8120
发布2018-09-05 17:19:00
举报
文章被收录于专栏:葬爱家族葬爱家族

废话

今天这篇来记录一下地图SDK中非常重要的一个功能:出行路线规划。我相信高德地图使用最多的也就是这个功能了,当然,我们今天的内容可能还做不到高德地图那么丰富的效果,比如林志玲娇嫩的语音指引你,但我们可以先做一个核心的功能就是把路线先画出来。

简介

我们在规划路线时,主要考虑的是四种模式:

  • 驾车模式
  • 步行模式
  • 公交模式
  • 骑行模式

其实高德SDK里远远不止这四种模式,还有很多细分模式,比如不走高速、最少红绿灯、避免拥堵、多策略模式等等,道理是一样的,我们暂且忽略这些细分模式。

作为演示demo,我们也没必要每种模式都演示下,换汤不换药,我们只演示下驾车模式即可,驾车模式学会了,其它任何模式都是手到擒来。

1、添加Marker

为了显示出起点和终点,我们为起点和终点分别添加两个Marker。

代码语言:javascript
复制
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、路径规划

代码语言:javascript
复制
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方法返回,拿到返回数据后,我们就可以把路径绘制在地图上了。

这里先别急,我们看下回调的数据。

代码语言:javascript
复制
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
    List<DrivePath> drivePathList = result.getPaths();
}

回调中我们通过result可以获得一个DrivePath的列表,为什么是一个列表呢?很简单,使用过高德地图的都知道,起点通往终点的,可能是多种路线方案,所以需要一个List来保存,那我们这里就取出第0个,接着往下看。

代码语言:javascript
复制
@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,接着往下看。

代码语言:javascript
复制
@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、多色路径

路径虽然出来了,但是细心的朋友肯定发现了,这个路径并没有体现出道路的畅通状况,使用过高德地图的都知道,实时了解道路的畅通状况有利于我们选择恰当的路线,那怎么根据不同路段畅通状况绘制不同颜色呢,接着往下看。

代码语言:javascript
复制
@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绘制在路径上呢?
代码语言:javascript
复制
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,到这里我们基本理清了思路,既然驾车模式可以,其它任何一种模式当然也难不倒我们。下面演示下四种模式的路径规划,作为本节的结束。

总结

今天这篇我没有把全部的代码贴出来,一来是太多了,二来是觉得没必要,把思路理清楚是最重要的,没有明白原理,拿到源码也没意义。好吧,本期节目就到这里,感谢大家收看,我们下期再见~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 废话
  • 简介
    • 1、添加Marker
      • 2、路径规划
        • 3、路径回调
          • 3、多色路径
            • 4、四种模式路径规划
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档