Android高德地图多路线规划实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现思路:
当点击地图线段的时候获取对应坐标点,然后跟路线上的坐标点比对,如果经纬度各自的差值都小于0.000001,则选择该路线。(为啥小于0.00001,是考虑到两条路线如果坐标相差很近时,给的一个差值范围)
实现思路步骤:
1.获取屏幕点击线段的坐标:
在多路线规划完成后,可以设置AMap中的setOnPolylineClickListener方法监听。
代码如下:
//.....多余代码省略
{
mAmap.setOnPolylineClickListener(this);
//......多余代码省略
}
@Override
public void onPolylineClick(Polyline polyline) {
}
该方法是监听地图上线段点击回调。我们路线规划出来,在屏幕上就是一段一段线段拼接出来的。
回调出来这个类Polyline查看高德提供的参考手册可以知道如下:
回调出来就是点击的该线段,我们继续看参考手册,看提供的相应方法
里面有个获取线段顶点坐标列表的方法getPoints()。
然后我们获取路线对应的坐标列表,高德地图中路线这个类对应的是RouteOverLay这个类。
同样的我们得去看下高德提供参考手册,其中有个方法是获取导航路径对象——getAMapNaviPath()。
2、坐标比较,选择对应路线:
现在地图线段坐标集合和路线对应的坐标集合都有了,接下来取线段坐标集合任意一点跟路线对应的坐标集做差值计算,如果经纬度都小于0.000001我们一开始设定的范围,则认为点击到该路线,则把该路线高亮显示。
代码如下:
@Override
public void onPolylineClick(Polyline polyline) {
if(routeOverlays != null && routeOverlays.size() == 1){ //路线只有一条,没必要选择路线。
return;
}
List
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
.getAMapNaviPath().getCoordList(); //获取路线所有坐标集合
for (NaviLatLng naviLatLng : naviLatLngs) {//遍历路线的坐标集合
if (Math.abs((naviLatLng.getLatitude() - titude)) <= 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;
}
}
}
}
至此,整体的思路就是这样。