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 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

R语言可视化——关于ggplot所支持的数据地图素材类型

做了这么多数据地图,是时候该总结一些心得和理念了,今天这篇讨论ggplot2所支持的数据地图素材格式。 library("plyr") library("dp...

3994
来自专栏码代码的陈同学

异常处理的反模式

异常设计实践 中有位读者评论:又记录日志又抛异常反模式设计。其实我并不知道反模式,本文是对于反模式的学习整理,数据都来自参考资料。

1615
来自专栏不二小段

【爬虫与反爬】记一次网址编码研究

相爱相杀的爬虫与反爬工程师啊……愿你们和谐相处。 前些日子写爬虫时遇到一个比较奇怪的编码,是构造目标网址的一个组成部分,我更倾向于说是编码而不是加密,虽然的确有...

3458
来自专栏JackieZheng

漫谈可视化Prefuse(六)---改动源码定制边粗细

可视化一路走来,体会很多;博客一路写来,收获颇丰;代码一路码来,思路越来越清晰。终究还是明白了一句古话:纸上得来终觉浅,绝知此事要躬行。   跌跌撞撞整合了个...

2068
来自专栏FreeBuf

分析无线遥控器信号并制作Hack硬件进行攻击

*原创作者:ZMOM1031,本文属FreeBuf原创奖励计划,未经许可禁止转载 ? 无线遥控器(无线电遥控器)在我们生活中非常常见,应用于各种场景,方...

2838
来自专栏数据结构与算法

BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

Description   小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取 的时候,可以随意选择一堆石子,在...

2716
来自专栏圣杰的专栏

DDD理论学习系列(7)-- 值对象

? 1.引言 提到值对象,我们可能立马就想到值类型和引用类型。而在C#中,值类型的代表是strut和enum,引用类型的代表是class、interface、...

2847
来自专栏ACM小冰成长之路

51Nod-1671-货物运输

ACM模版 描述 ? 题解 官方题解: ? 首先我们需要注意到最重要的一点,所有运输方案同时进行,我们只需要计算最后到达的方案的花费时间的最小值。所以我们需要考...

2135
来自专栏算法channel

问答记录贴 1 | 解析 NumPy 的广播(broadcasting)机制

实践出真知,相互讨论碰撞出思想的火花。【原创互助答疑群】内有的问答很精彩。于是脑子里闪现出一个想法,为什么不把整个的问答过程记录总结下来,分享给更多的小伙伴呢?...

1181
来自专栏数据和云

大象起舞:用PostgreSQL解海盗分金问题

今天午休期间刷微信,看到云和恩墨的盖总转了一条朋友圈,说杨长老在Oracle中用SQL解海盗分金问题(原文《无往不利:用SQL解海盗分金的利益最大化问题》,看完...

1316

扫码关注云+社区

领取腾讯云代金券