Android高德地圖多路線規劃----可點擊選擇路線

最近項目上有用到高德sdk,需求上要求多路線規劃,並且可以在地圖上點擊選擇路線。本着不想重複造輪子的驅使下(其實想偷懶),網上似乎沒有例子,也可能是我找不到。最後沒辦法,只能自己實現。
在此做爲記錄,如果有更好方法,勞煩指出。

實現效果如下:
這裏寫圖片描述

實現思路

當點擊地圖線段的時候獲取對應座標點,然後跟路線上的座標點比對,如果經緯度各自的差值都小於0.000001,則選擇該路線。
PS:爲啥小於0.00001,是考慮到兩條路線如果座標相差很近時,給的一個差值範圍

實現思路步驟

1.獲取屏幕點擊線段的座標

在多路線規劃完成後(多路線規劃的在這就不敘述了,官網例子較詳細),可以設置AMap的setOnPolylineClickListener方法監聽。

代碼如下:

 //.....多餘代碼省略
 {
     mAmap.setOnPolylineClickListener(this);
     //......多餘代碼省略
 }
 @Override
 public void onPolylineClick(Polyline polyline) {
 }

該方法是監聽地圖上線段點擊回調。我們路線規劃出來,在屏幕上就是一段一段線段拼接出來的。
回調出來這個類Polyline 究竟是什麼呢?
查看高德提供的參考手冊
這裏寫圖片描述

回調出來就是點擊的該線段,我們繼續看參考手冊,看提供的相應方法。
這裏寫圖片描述

裏面有個獲取線段頂點座標列表的方法getPoints()
我們先把這個經緯度座標列表打印出來看下。

在此我們第一步驟就完成了。

獲取路線對應的座標列表

高德地圖中路線這個類對應的是RouteOverLay這個類。
這裏寫圖片描述
同樣的我們得去看下高德提供參考手冊,有哪些方法可以提供。在翻看很久情況下都沒找到類似LatLng經緯度數據這個類,但是其中有個方法是獲取導航路徑對象——getAMapNaviPath()
這裏寫圖片描述
我們再點擊查看這個類有什麼方法是可以獲取經緯度列表的。果然有獲取座標的列表。
這裏寫圖片描述
同樣的我們把這個經緯度集合打印出來看下,是不是預想效果。

打印出來的經緯度座標巨多,因爲路線規劃是多個線段的組合所以座標會很多。

座標比較,選擇對應路線

好了現在地圖線段座標集合和路線對應的座標集合都有了,如何做比較呢?
我的思路是這樣的,取線段座標集合任意一點跟路線對應的座標集做差值計算,如果經緯度都小於0.000001我們一開始設定的範圍,則認爲點擊到該路線,則把該路線高亮顯示。
代碼如下:

@Override
    public void onPolylineClick(Polyline polyline) {
        if( routeOverlays != null && routeOverlays.size() == 1){  //路線只有一條,沒必要選擇路線。
            return;
        }
        List<LatLng> latLngs = polyline.getPoints();
        if (latLngs.size() == 0){//確定獲取線段有座標集合
            return;
        }
        LatLng latLng = latLngs.get(0);//取線段的第一個座標就好
        outer:
        for (int i = 0; i < routeOverlays.size(); i++) {//遍歷路線集合
            int key = routeOverlays.keyAt(i);
            List<NaviLatLng> naviLatLngs = routeOverlays.get(key)
                                .getAMapNaviPath().getCoordList();  //獲取路線所有座標集合
            for (NaviLatLng naviLatLng : naviLatLngs) {//遍歷路線的座標集合
                if (Math.abs((naviLatLng.getLatitude() - latLng.latitude)) <= 0.000001
                        && Math.abs((naviLatLng.getLongitude()- latLng.longitude)) <= 0.00001){//符合差值範圍
                    if (i == routeIndex){   // 已經選過該路線 跳轉下一條路線 點擊的線段可能是兩條路線的重複路段
                        continue outer;
                    }
                    //下面循環方法是繪製沒選中路線不高亮
                    for (int j = 0; j < routeOverlays.size(); j++) {
                        if (i == j){    //選中路線 先不用畫
                            continue;
                        }
                        int key2 = routeOverlays.keyAt(j);
                        routeOverlays.get(key2).setTransparency(0.4f);
                        routeOverlays.get(key).setZindex(0);
                    }
                    routeOverlays.get(key).setTransparency(1.0f);
                    /**把用戶選擇的那條路的權值弄高,使路線高亮顯示的同時,重合路段不會變的透明**/
                    routeOverlays.get(key).setZindex(1);
                    mAMapNavi.selectRouteId(key);
                    routeIndex = i;
                    chooseRouteSuccess = true;
                    return;
                }
            }
        }
    }

至此,整體的思路就是這樣。
具體Demo地址:https://github.com/CTSN/RouteDemo
實現方法如有不足之處,請指出。
題外話:看自己上篇博客的時間已經是去年了,自己偷懶了,得多學習了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章