廢話
今天這篇來記錄一下地圖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,到這里我們基本理清了思路,既然駕車模式可以,其它任何一種模式當然也難不倒我們。下面演示下四種模式的路徑規劃,作為本節的結束。
總結
今天這篇我沒有把全部的代碼貼出來,一來是太多了,二來是覺得沒必要,把思路理清楚是最重要的,沒有明白原理,拿到源碼也沒意義。好吧,本期節目就到這里,感謝大家收看,我們下期再見~