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
实现方法如有不足之处,请指出。
题外话:看自己上篇博客的时间已经是去年了,自己偷懒了,得多学习了。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值