最近項目上有用到高德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
實現方法如有不足之處,請指出。
題外話:看自己上篇博客的時間已經是去年了,自己偷懶了,得多學習了。