专栏首页葬爱家族Android高德之旅(17)出行路线规划废话简介总结

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

废话

今天这篇来记录一下地图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,到这里我们基本理清了思路,既然驾车模式可以,其它任何一种模式当然也难不倒我们。下面演示下四种模式的路径规划,作为本节的结束。

总结

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android高德之旅(2)地图类型

    今天继续我们的Android高德之旅,上一篇已经可以显示最基本的地图了,有基本的缩放、旋转功能,还有最后做的小特效,今天这篇文章来记录一下高德地图的5种地图类型...

    大公爵
  • Android高德之旅(16)交通态势查询废话看代码总结

    交通态势信息是由当前时刻和未来某一时刻的交通状况信息构成,目前该功能仅对当前时刻对交通状况(路况)信息进行了透出。这篇有点尴尬的是,实在不好用地图来演示,所以就...

    大公爵
  • Android高德之旅(5)室内地图废话开关室内地图总结

    大公爵
  • List与List<?>的区别何在

    泛型是Java最基础的语法之一,不过这种语法依然有值得一说的地方:如果仅停留在泛型的基本使用上,泛型当然很简单;但如果从字节码层次来看泛型,将会发现更多泛型的本...

    疯狂软件李刚
  • Scala入门学习笔记四--List使用

    前言 本篇将介绍一个和Array很相似的集合List,更多内容请参考:Scala教程 本篇知识点概括 List的构造 List与Array的区别 Lis...

    用户1174963
  • Java工具集-集合(CollectionUtils)

    cwl_java
  • JAVA 泛型

    命名类型参数 推荐的命名约定是使用大写的单个字母名称作为类型参数。这与 C++ 约定有所不同(参阅 附录 A:与 C++ 模板的比较),并反映了...

    用户1688446
  • Why to do,What to do,Where to do 与 Lambda表达式!

    最近我做一个“四象限”图表控件,其中有一个比较复杂的“坐标变换”问题,即是如何让一组数据放到有限的一个区间内,例如有一组数据 List[4,5,6,7,8],要...

    用户1177503
  • 有趣的Scala列表

    其中Nil表示空列表,::符号表示在列表前面追加元素,所以如果没有后面的Nil,Scala就会报错。

    哒呵呵
  • Java List面试题汇总

    1、你知道的List都有哪些? 2、List和Vector有什么区别? 3、List是有序的吗? 4、ArrayList和LinkedList的区别?分别用在什...

    Java技术栈

扫码关注云+社区

领取腾讯云代金券