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,到這里我們基本理清了思路,既然駕車模式可以,其它任何一種模式當然也難不倒我們。下面演示下四種模式的路徑規劃,作為本節的結束。


總結

今天這篇我沒有把全部的代碼貼出來,一來是太多了,二來是覺得沒必要,把思路理清楚是最重要的,沒有明白原理,拿到源碼也沒意義。好吧,本期節目就到這里,感謝大家收看,我們下期再見~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容