廢話
今天這篇來記錄一下地圖SDK中非常重要的一個功能:出行路線規(guī)劃才避。我相信高德地圖使用最多的也就是這個功能了遇革,當(dāng)然潦匈,我們今天的內(nèi)容可能還做不到高德地圖那么豐富的效果谚咬,比如林志玲嬌嫩的語音指引你烘嘱,但我們可以先做一個核心的功能就是把路線先畫出來昆禽。
簡介
我們在規(guī)劃路線時,主要考慮的是四種模式:
- 駕車模式
- 步行模式
- 公交模式
- 騎行模式
其實高德SDK里遠(yuǎn)遠(yuǎn)不止這四種模式蝇庭,還有很多細(xì)分模式醉鳖,比如不走高速、最少紅綠燈哮内、避免擁堵盗棵、多策略模式等等,道理是一樣的北发,我們暫且忽略這些細(xì)分模式纹因。
作為演示demo,我們也沒必要每種模式都演示下琳拨,換湯不換藥瞭恰,我們只演示下駕車模式即可,駕車模式學(xué)會了狱庇,其它任何模式都是手到擒來惊畏。
1、添加Marker
為了顯示出起點和終點密任,我們?yōu)槠瘘c和終點分別添加兩個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、路徑規(guī)劃
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, //路徑規(guī)劃的起點和終點
RouteSearch.DrivingDefault, //駕車模式
null, //途經(jīng)點
null, //示避讓區(qū)域
"" //避讓道路
);
routeSearch.calculateDriveRouteAsyn(query);
}
在規(guī)劃路徑時批什,你可以選擇性地添加途經(jīng)點农曲,比如你和朋友約好在一個地方捎上他,還可以添加避讓區(qū)驻债,比如你不想經(jīng)過和前女友分手的地方乳规,可以說還是很人性化的。
3合呐、路徑回調(diào)
規(guī)劃的路徑會通過onDriveRouteSearched方法返回暮的,拿到返回數(shù)據(jù)后,我們就可以把路徑繪制在地圖上了淌实。
這里先別急冻辩,我們看下回調(diào)的數(shù)據(jù)猖腕。
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
List<DrivePath> drivePathList = result.getPaths();
}
回調(diào)中我們通過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愚战,這個也不奇怪娇唯,使用過高德地圖的都知道,轉(zhuǎn)彎凤巨、掉頭视乐、換高速都是一段新的開始。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,調(diào)用DriveStep.getPolyline()方法可以獲得一個List<LatLonPoint>彰檬,哦伸刃,到這里終于拿到我們想要的了,一個List<LatLonPoint>就可以描述一段路徑逢倍,所有的DriveStep連起來就描述了整條規(guī)劃路徑捧颅。那么至此,我們理論上已經(jīng)可以畫出規(guī)劃路徑了较雕。終于怎么畫碉哑,就是用之前畫線段的方法,這里就不細(xì)說了亮蒋。
3扣典、多色路徑
路徑雖然出來了,但是細(xì)心的朋友肯定發(fā)現(xiàn)了慎玖,這個路徑并沒有體現(xiàn)出道路的暢通狀況贮尖,使用過高德地圖的都知道,實時了解道路的暢通狀況有利于我們選擇恰當(dāng)?shù)穆肪€趁怔,那怎么根據(jù)不同路段暢通狀況繪制不同顏色呢湿硝,接著往下看薪前。
@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就是這段路暢通狀態(tài)的一個描述示括,它的取值只會是以下范圍:
- “暢通”
- “緩行”
- “擁堵”
- “嚴(yán)重?fù)矶隆?/li>
- “未知”
哦原來如此,結(jié)合下面的List<LatLonPoint>蚤吹,我們就可以把每一段路程都對應(yīng)上暢通狀況例诀,根據(jù)暢通狀況選擇不同的顏色,從而構(gòu)建出一個顏色List裁着,那么怎么把這個顏色List繪制在路徑上呢?
List<Integer> colorList = new ArrayList<>();
PolylineOptions polylineOptions = new PolylineOptions();
polylineOptions.colorValues(colorList);
aMap.addPolyline(polylineOptions);
在構(gòu)建PolylineOptions時拱她,我們可以調(diào)用polylineOptions.colorValues(colorList);把顏色List設(shè)置進(jìn)去二驰,這樣再調(diào)用aMap.addPolyline(polylineOptions)時,就會自動繪制出不同的顏色秉沼。
4桶雀、四種模式路徑規(guī)劃
OK,到這里我們基本理清了思路唬复,既然駕車模式可以矗积,其它任何一種模式當(dāng)然也難不倒我們。下面演示下四種模式的路徑規(guī)劃敞咧,作為本節(jié)的結(jié)束棘捣。
總結(jié)
今天這篇我沒有把全部的代碼貼出來,一來是太多了休建,二來是覺得沒必要乍恐,把思路理清楚是最重要的,沒有明白原理测砂,拿到源碼也沒意義茵烈。好吧,本期節(jié)目就到這里砌些,感謝大家收看呜投,我們下期再見~