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


总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容