百度地图实现小车规划路线后平滑移动功能
文章目的
项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写的demo
实现效果
代码下载
下载链接
下面是实现的关键步骤
集成百度地图
怎么集成自然是看百度地图开发平台提供的文档。
文档连接
规划线路
看百度地图的文档,写一个规划线路的工具类(驾车的)
packagecom.wzhx.car_smooth_move_demo.utils; importandroid.util.Log; importcom.baidu.mapapi.search.route.BikingRouteResult; importcom.baidu.mapapi.search.route.DrivingRoutePlanOption; importcom.baidu.mapapi.search.route.DrivingRouteResult; importcom.baidu.mapapi.search.route.IndoorRouteResult; importcom.baidu.mapapi.search.route.MassTransitRouteResult; importcom.baidu.mapapi.search.route.OnGetRoutePlanResultListener; importcom.baidu.mapapi.search.route.PlanNode; importcom.baidu.mapapi.search.route.RoutePlanSearch; importcom.baidu.mapapi.search.route.TransitRouteResult; importcom.baidu.mapapi.search.route.WalkingRouteResult; importcom.wzhx.car_smooth_move_demo.listener.OnGetDrivingResultListener; publicclassRoutePlanUtil{ privateRoutePlanSearchmRoutePlanSearch=RoutePlanSearch.newInstance(); privateOnGetDrivingResultListenergetDrivingResultListener; privateOnGetRoutePlanResultListenergetRoutePlanResultListener=newOnGetRoutePlanResultListener(){ @Override publicvoidonGetWalkingRouteResult(WalkingRouteResultwalkingRouteResult){ } @Override publicvoidonGetTransitRouteResult(TransitRouteResulttransitRouteResult){ } @Override publicvoidonGetMassTransitRouteResult(MassTransitRouteResultmassTransitRouteResult){ } @Override publicvoidonGetDrivingRouteResult(DrivingRouteResultdrivingRouteResult){ Log.e("测试",drivingRouteResult.error+":"+drivingRouteResult.status); getDrivingResultListener.onSuccess(drivingRouteResult); } @Override publicvoidonGetIndoorRouteResult(IndoorRouteResultindoorRouteResult){ } @Override publicvoidonGetBikingRouteResult(BikingRouteResultbikingRouteResult){ } }; publicRoutePlanUtil(OnGetDrivingResultListenergetDrivingResultListener){ this.getDrivingResultListener=getDrivingResultListener; this.mRoutePlanSearch.setOnGetRoutePlanResultListener(this.getRoutePlanResultListener); } publicvoidroutePlan(PlanNodestartNode,PlanNodeendNode){ mRoutePlanSearch.drivingSearch((newDrivingRoutePlanOption()) .from(startNode).to(endNode) .policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_TIME_FIRST) .trafficPolicy(DrivingRoutePlanOption.DrivingTrafficPolicy.ROUTE_PATH_AND_TRAFFIC)); } }
规划线路后需要将实时路况索引保存,为后面画图需要
//设置路段实时路况索引 ListallStep=selectedRouteLine.getAllStep(); mTrafficTextureIndexList.clear(); for(intj=0;j 0){ for(intk=0;k 要将路线规划的路线上的路段再细分(切割),这样小车移动才会平滑
/** *将规划好的路线点进行截取 *参考百度给的小车平滑轨迹移动demo实现。(循环的算法不太懂) *@paramrouteLine *@paramdistance *@return */ privateArrayListdivideRouteLine(ArrayList routeLine,doubledistance){ //截取后的路线点的结果集 ArrayList result=newArrayList<>(); mNewTrafficTextureIndexList.clear(); for(inti=0;i endPoint.latitude); booleanisXReverse=(startPoint.longitude>endPoint.longitude); doubleintercept=getInterception(slope,startPoint); doublexMoveDistance=isXReverse?getXMoveDistance(slope,distance): -1*getXMoveDistance(slope,distance); doubleyMoveDistance=isYReverse?getYMoveDistance(slope,distance): -1*getYMoveDistance(slope,distance); ArrayList temp1=newArrayList<>(); for(doublej=startPoint.latitude,k=startPoint.longitude; !((j>endPoint.latitude)^isYReverse)&&!((k>endPoint.longitude)^isXReverse);){ LatLnglatLng=null; if(slope==Double.MAX_VALUE){ latLng=newLatLng(j,k); j=j-yMoveDistance; }elseif(slope==0.0){ latLng=newLatLng(j,k-xMoveDistance); k=k-xMoveDistance; }else{ latLng=newLatLng(j,(j-intercept)/slope); j=j-yMoveDistance; } finalLatLngfinalLatLng=latLng; if(finalLatLng.latitude==0&&finalLatLng.longitude==0){ continue; } mNewTrafficTextureIndexList.add(mTrafficTextureIndexList.get(i)); temp1.add(finalLatLng); } result.addAll(temp1); if(i==routeLine.size()-2){ result.add(endPoint);//终点 } } returnresult; } 最后是开启子线程,对小车状态进行更新(车头方向和小车位置)
/** *循环进行移动逻辑 */ publicvoidmoveLooper(){ moveThread=newThread(){ publicvoidrun(){ ThreadthisThread=Thread.currentThread(); while(!exit){ for(inti=0;i=latLngs.size()-1){ exit=true; break; } //擦除走过的路线 intlen=mNewTrafficTextureIndexList.subList(mIndex,mNewTrafficTextureIndexList.size()).size(); Integer[]integers=mNewTrafficTextureIndexList.subList(mIndex,mNewTrafficTextureIndexList.size()).toArray(newInteger[len]); int[]index=newint[integers.length]; for(intx=0;x 0){ mPolyline.setIndexs(index); mPolyline.setPoints(latLngs.subList(mIndex,latLngs.size())); } //这里是小车的当前点和下一个点,用于确定车头方向 finalLatLngstartPoint=latLngs.get(mIndex); finalLatLngendPoint=latLngs.get(mIndex+1); mHandler.post(newRunnable(){ @Override publicvoidrun(){ //更新小车的位置和车头的角度 if(mMapView==null){ return; } mMoveMarker.setPosition(startPoint); mMoveMarker.setRotate((float)getAngle(startPoint, endPoint)); } }); try{ //控制线程更新时间间隔 thisThread.sleep(TIME_INTERVAL); }catch(InterruptedExceptione){ e.printStackTrace(); } } } } }; //启动线程 moveThread.start(); } 声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。