Android 高德地图自定义线路规划选择方案之后按照方案进行导航

因为我这边导航需求的问题,导致我这边不能使用高德地图官方的线路规划和导航。所以我这边线路规划和导航界面都是根据高德地图那边给的api进行自定义的,这篇主要讲我在路线规划方案选择之后按照方案进行导航。

线路规划界面大致是这样的情况,所以我这边就不能像之前那样只做一条路线的查询。

然后我这边开始的时候就用了之前那种获取路径的方法,并且绘制出来。不过这里是多条线路的查询,只需要跟之前传的参数多多路径查询就可以得到高德地图那边返回多条路线的数据。

     /*** 开始搜索路径规划方案 驾车*/public void searchRouteResultCar(LatLonPoint mStartPoint, LatLonPoint mEndPoint) {final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(mStartPoint, mEndPoint);RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, 10, null, null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式 大于等于10 的时候是多路径规划,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路mRouteSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询}
 /*** 开始搜索路径规划方案 步行*/public void searchRouteResultWalk(LatLonPoint mStartPoint, LatLonPoint mEndPoint) {final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(mStartPoint, mEndPoint);RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(fromAndTo);mRouteSearch.calculateWalkRouteAsyn(query);// 异步路径规划步行模式查询}

两种线路搜索步行和驾车,步行返回的只有一种方案,而驾车返回的是最多3中的方案。
线路搜索高德地图的API 想了解详请的可以去看一下

之后就是根据返回的方案在界面上绘制出一种默认选中的路线,点击其他的item,就将当前显示的清除掉,绘制选中的那条线路。(我的做法比较死板,但是也可以将三条都绘制出来,然后将默认选中的那条线路正常颜色绘出,其他未选中的可以这只50%的透明度,这样在界面上就可以看出三种方案。)

线路搜索的监听事件

 /*** 路径规划搜索监听*/RouteSearch.OnRouteSearchListener mRouteSearchListener = new RouteSearch.OnRouteSearchListener() {@Overridepublic void onBusRouteSearched(BusRouteResult busRouteResult, int i) {// 公交路径}@Overridepublic void onDriveRouteSearched(DriveRouteResult result, int errorCode) {// 驾车路径mAmap.clear();// 清理地图上的所有覆盖物if (errorCode == AMapException.CODE_AMAP_SUCCESS) {if (result != null && result.getPaths() != null) {if (result.getPaths().size() > 0) {mDriveRouteResult = result;final DrivePath drivePath = mDriveRouteResult.getPaths().get(0);if(drivePath == null) {mIsEmpty = true;showEmpty();return;}mIsFirstClickCar = false;mIsEmpty = false;showEmpty();mListInfo.clear();for (int i = 0; i < mDriveRouteResult.getPaths().size(); i++){mListInfo.add(new SharedNavigationGoHereBean(mDriveRouteResult.getPaths().get(i),i == 0 ? true : false));}mAdapter.setDatas(mListInfo);hideLoading();SharedGoHereDrivingRouteOverlay drivingRouteOverlay = new SharedGoHereDrivingRouteOverlay(SharedNavigationGoHereActivity.this, mAmap, drivePath,mDriveRouteResult.getStartPos(),mDriveRouteResult.getTargetPos(), null,true);drivingRouteOverlay.setNodeIconVisibility(false);//设置节点marker是否显示drivingRouteOverlay.setIsColorfulline(false);//是否用颜色展示交通拥堵情况,默认truedrivingRouteOverlay.removeFromMap();drivingRouteOverlay.addToMap();drivingRouteOverlay.zoomToSpan();dataBinding.rvGuideList.setVisibility(View.VISIBLE);dataBinding.tvWorkContent.setVisibility(View.GONE);dataBinding.ivGoGuide.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 进入导航界面goGuideActivity();}});} else if (result != null && result.getPaths() == null) {mIsEmpty = true;showEmpty();}} else {mIsEmpty = true;showEmpty();}} else {mIsEmpty = true;showEmpty();}}@Overridepublic void onWalkRouteSearched(WalkRouteResult result, int errorCode) {// 步行路径mAmap.clear();// 清理地图上的所有覆盖物if (errorCode == AMapException.CODE_AMAP_SUCCESS) { // 需要做缓存 下一次直接切换if (result != null && result.getPaths() != null) {if (result.getPaths().size() > 0) {mWalkRouteResult = result;final WalkPath walkPath = mWalkRouteResult.getPaths().get(0);mIsFirstClickWalk = false;hideLoading();if(walkPath == null) {mIsEmpty = true;showEmpty();return;}mIsEmpty = false;showEmpty();WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(SharedNavigationGoHereActivity.this, mAmap, walkPath,mWalkRouteResult.getStartPos(),mWalkRouteResult.getTargetPos());walkRouteOverlay.removeFromMap();walkRouteOverlay.addToMap();walkRouteOverlay.zoomToSpan();dataBinding.tvWorkContent.setVisibility(View.VISIBLE);int dis = (int) walkPath.getDistance();int dur = (int) walkPath.getDuration();String des = AMapUtil.getFriendlyTime(dur)+"   "+AMapUtil.getFriendlyLength(dis);dataBinding.tvWorkContent.setText(des);dataBinding.rvGuideList.setVisibility(View.GONE);dataBinding.ivGoGuide.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 进入导航界面goGuideActivity();}});} else if (result != null && result.getPaths() == null) {mIsEmpty = true;showEmpty();mIsFirstClickWalk = false;hideLoading();}} else {mIsEmpty = true;showEmpty();mIsFirstClickWalk = false;hideLoading();}} else {mIsEmpty = true;showEmpty();mIsFirstClickWalk = false;hideLoading();}}@Overridepublic void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {// 骑行路径}};

如果你不会根据自定义的方案,选中之后按照自己选中的进行自定义的导航事件,那么到这里就已经实现了。

这个是我之前的做法,导致后面按照方案导航一直都没有想到要怎么实现选中方案进行导航,然后就有了之后的实现方式,这个跟上面完全不一样。由于跟导航相关,所以跟导航的相关信息挂钩。

在显示方案的界面做导航对象的实例化,它是属于一个单例

 /*** 导航对象(单例)*/private AMapNavi mAMapNavi;

然后对导航事件的监听和开始路线搜索:

     // 初始化导航对象,由于是单例,所以需要传入Application的ContextmAMapNavi = AMapNavi.getInstance(getApplicationContext());mAMapNavi.addAMapNaviListener(this);// 开始计算驾车的情况的路线int strategyFlag = 0;try {// 这个是我保存到本地的算路的时候的一些条件hightspeed = SPUtils.getInt(SPUtils.GUIDE_GSYX)==1; // 高度优先avoidhightspeed = SPUtils.getInt(SPUtils.GUIDE_DBGS)==1; // 躲避高速cost = SPUtils.getInt(SPUtils.GUIDE_DBSF)==1; // 躲避收费congestion = SPUtils.getInt(SPUtils.GUIDE_DBYD)==1; // 躲避拥堵// 最后一个传true,表示我需要返回多条路线的值, 传false表示只会返回一条路线strategyFlag = mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, true);} catch (Exception e) {e.printStackTrace();}if (strategyFlag >= 0) {startList.add(new NaviLatLng(Constants.mLatitude,Constants.mLongitude)); // 从我的位置开始导航endList.add(new NaviLatLng(mLat,mLng)); // 目的地位置mAMapNavi.calculateDriveRoute(startList, endList, null, strategyFlag); // 开始计算}

由于当前初始化的Activity销毁之后就不会再回调导航的状态,所以在进入导航界面一定不能finish掉这个activity。向前创建新的界面到时无所谓,但是我这边还有一个其他的功能,导致向后也需要保存这个界面的存在,所以我将当前activity进行压栈的处理。Activity自带的

 moveTaskToBack(true);
 @Overrideprotected void onDestroy() {super.onDestroy();/*** 当前页面只是展示地图,activity销毁后不需要再回调导航的状态*/mAMapNavi.removeAMapNaviListener(this);mAMapNavi.destroy();}

计算路线成功之后的监听事件,由于导航对象监听事件比较多,我这边就主要讲我使用的几个方法。

     @Override // 计算线路返回成功,由于我计算的是多个线路,所以这里是一个集合public void onCalculateRouteSuccess(int[] ints) {//清空上次计算的路径列表。routeOverlays.clear();HashMap<Integer, AMapNaviPath> paths = mAMapNavi.getNaviPaths();for (int i = 0; i < ints.length; i++) {AMapNaviPath path = paths.get(ints[i]);if (path != null) {// 将获取的线路绘制到界面上drawRoutes(ints[i], path);}}}

绘制到界面上

    private void drawRoutes(int routeId, AMapNaviPath path) {calculateSuccess = true;mAmap.moveCamera(CameraUpdateFactory.changeTilt(0)); RouteOverLay routeOverLay = new RouteOverLay(mAmap, path, this);
//        routeOverLay.setTrafficLine(false);
//        routeOverLay.zoomToSpan();
//        routeOverLay.addToMap(); // 前面的RouteOverLay 也可以正常将线路绘制到界面上,由于我这边绘制的线路有UI样式的实现,所以我这边需要进行自定义实现// 将获取到的线路保存到缓存中,方便下一次使用routeOverlays.put(routeId, routeOverLay);// 判断缓存中的数据数量是否与查询出来的数据数量一致if (routeOverlays.size() == mAMapNavi.getNaviPaths().size()){ // 一致就开始绘制自己需要的界面mIsFirstClickCar = false; // 下一次点击驾车就不进行计算,直接从缓存中获取mIsEmpty = false; // 数据不是空showEmpty(); // 显示数据不是空的布局mListInfo.clear(); // 方案列表的数据清空for (int i = 0; i < routeOverlays.size(); i++){// 根据key去获取AMapNaviPath的值,防止拿错的情况int key = routeOverlays.keyAt(i);// 将当前key值的数据对应的放到list中mListInfo.add(new SharedNavigationGoHereBeanBack(routeOverlays.get(key).getAMapNaviPath(),i == 0 ? true : false));}// 更新界面mAdapter.setDatas(mListInfo);// 计算中的动画停止hideLoading();// 绘制默认选中的那一条线路 ,这里跟上面差不了太多,只不过里面的类不怎么一样SharedGoHereDrivingRouteOverlayBackUp drivingRouteOverlay = new SharedGoHereDrivingRouteOverlayBackUp(SharedNavigationGoHereActivityBackUp.this, mAmap, mListInfo.get(0).getItem(),new NaviLatLng(Constants.mLatitude,Constants.mLongitude),new NaviLatLng(mLat,mLng), null,true);drivingRouteOverlay.setNodeIconVisibility(false);//设置节点marker是否显示drivingRouteOverlay.setIsColorfulline(false);//是否用颜色展示交通拥堵情况,默认truedrivingRouteOverlay.removeFromMap();drivingRouteOverlay.addToMap();drivingRouteOverlay.zoomToSpan();int key = routeOverlays.keyAt(0);mAMapNavi.selectRouteId(key);dataBinding.rvGuideList.setVisibility(View.VISIBLE);dataBinding.tvWorkContent.setVisibility(View.GONE);dataBinding.ivGoGuide.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 进入导航界面goGuideActivity();}});}}

这个是属于导航对象选择线路的切换。 每一次点击方案的切换都需要调用当前界面显示路线值赋值给导航对象。

如果没有调用这一步,导航对象会默认没有可以导航的路线。

            int key = routeOverlays.keyAt(0);mAMapNavi.selectRouteId(key);

下面是到我自定义的导航界面中,初始化还是跟方案界面的一样初始化,只是在进入到导航界面就可以开始调用开始导航的API了。

 mAMapNavi.startNavi(AMapNavi.GPSNaviMode);

这样就可以按照我选择的方案进行导航了。

Android 高德地图自定义线路规划选择方案之后按照方案进行导航相关推荐

  1. Android 高德地图中路线规划绘制界面线路

    Android 高德地图中路线规划绘制界面线路 下面代码是根据很多的经纬度的点,绘制出直线的线路.比较死板 /*** 绘制景区的路线*/private void setRouteInfo(List&l ...

  2. Android高德地图自定义Markers的例子

    下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地 ...

  3. Android高德地图自定义Mark并实现聚合效果

    Android高德地图自定义Mark并实现聚合效果 起因:公司本来项目里面用到了高德地图,然后最近老板看见别人的APP里面有个聚合的这个功能,老板:"这个效果能不能实现,我也要!" ...

  4. Android高德地图多路线规划----可点击选择路线

    最近项目上有用到高德sdk,需求上要求多路线规划,并且可以在地图上点击选择路线.本着不想重复造轮子的驱使下(其实想偷懒),网上似乎没有例子,也可能是我找不到.最后没办法,只能自己实现. 在此做为记录, ...

  5. JSAPI 高德地图应用--线路规划、多条线路同时展示

    在地图应用中,常见的应用之一应该就有查询两个地方的线路规划吧,高德地图提供了驾车路线规划.货车路线规划.公车换乘服务.步行导航服务.骑行路径规划服务等,这里我用的是驾车路线规划做一个列子. 驾车路线规 ...

  6. Android高德地图自定义地图指南针

    高德地图的指南针默认位置在地图的左上角,并且位置不可以修改.我们可以自定义一个指南针. 效果如下图 1.在布局文件定义一个ImageView <ImageView android:id=&quo ...

  7. android高德地图自定义图层,自定义图层-图层-教程-地图 JS API | 高德地图API

    自定义图层 CustomLayer 自定义图层是完全由开发者指定绘制方法的图层.该图层可以是 canvas.svg.甚至可以是 dom 组成的图层. JSAPI 能够实现自定义图层与高德地图的同步平移 ...

  8. android高德地图自定义地图,Android实现高德地图自定义样式

    放置Android工程下的assets文件夹,在assets文件夹里面创建了一个styleMap子文件夹.将里面的文件写到sd卡中. 写出文件代码: try { // 先获取系统默认的文档存放根目录 ...

  9. (转载)Android高德地图多路线规划----可点击选择路线

    (转载)https://blog.csdn.net/VRoymond/article/details/79898400

最新文章

  1. pip19离线_更新pip为20后不显示下载链接无法离线下载回退pip版本
  2. 在不重装XP系统,增加系统盘剩余空间
  3. sql server2005 出现一个或多个参数无效
  4. xctf secret galaxy_三星SMARTTHINGS FIND正式发布 可帮助轻松查找GALAXY设备
  5. HttpClientFactory与Steeltoe结合来完成服务发现
  6. VS Code 关于SFTP上传文件到多服务器的配置
  7. java水果超市mysql_Java基础 | 项目实战之水果超市
  8. 钉钉宣布品牌全新升级 首次明确回答了自身和生态的关系
  9. 垃圾回收相关算法总结
  10. IEEE会议Latex模板下载教程
  11. java字符串替换一部分_字符串中部分字符替换
  12. win7网络里计算机登录失败,Win7访问网上邻居提示“登陆失败”原因及解决方法...
  13. Linux下Mysql5.5的Cmake安装以及sphinx结合
  14. 如何从XP安装光盘中提取taskmgr.exe
  15. CSO246未能找到类型或命名空间名“System“(是否缺少using指令或程序集引用?)
  16. 下一代Windows家庭服务器Vail本地化版本发布
  17. win7亮度怎么调_win7设置双屏显示的方法
  18. 利用QT制作串口助手
  19. POI和Java Excel Api导入导出----详细到你不敢相信
  20. 6-2 递归求阶乘和 (15 分)

热门文章

  1. js自定义提示框弹窗
  2. 换肤 技术 (转载)
  3. 后端框架之Flask--初识
  4. 编程和乐高机器人的区别
  5. 为何演网络电影?吕良伟:帮青年导演圆电影梦
  6. PlsntUML的在线画图网址
  7. Java对接混合支付、退款、提现心得
  8. 第五章面向对象编程设计与开发
  9. Uniapp之API promise化
  10. adc0832工作原理详解_单片机ADC的工作原理