如何使用百度地图实现小车规划路线后平滑移动功能
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,这篇文章主要介绍如何使用百度地图实现小车规划路线后平滑移动功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!文章目的项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写
千家信息网最后更新 2025年11月10日如何使用百度地图实现小车规划路线后平滑移动功能
这篇文章主要介绍如何使用百度地图实现小车规划路线后平滑移动功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
文章目的
项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写的demo
实现效果
下面是实现的关键步骤
集成百度地图
怎么集成自然是看百度地图开发平台提供的文档。
文档连接
规划线路
看百度地图的文档,写一个规划线路的工具类(驾车的)
package com.wzhx.car_smooth_move_demo.utils;import android.util.Log;import com.baidu.mapapi.search.route.BikingRouteResult;import com.baidu.mapapi.search.route.DrivingRoutePlanOption;import com.baidu.mapapi.search.route.DrivingRouteResult;import com.baidu.mapapi.search.route.IndoorRouteResult;import com.baidu.mapapi.search.route.MassTransitRouteResult;import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;import com.baidu.mapapi.search.route.PlanNode;import com.baidu.mapapi.search.route.RoutePlanSearch;import com.baidu.mapapi.search.route.TransitRouteResult;import com.baidu.mapapi.search.route.WalkingRouteResult;import com.wzhx.car_smooth_move_demo.listener.OnGetDrivingResultListener;public class RoutePlanUtil { private RoutePlanSearch mRoutePlanSearch = RoutePlanSearch.newInstance(); private OnGetDrivingResultListener getDrivingResultListener; private OnGetRoutePlanResultListener getRoutePlanResultListener = new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) { } @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { } @Override public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) { } @Override public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { Log.e("测试", drivingRouteResult.error + ":" + drivingRouteResult.status); getDrivingResultListener.onSuccess(drivingRouteResult); } @Override public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) { } @Override public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) { } }; public RoutePlanUtil(OnGetDrivingResultListener getDrivingResultListener) { this.getDrivingResultListener = getDrivingResultListener; this.mRoutePlanSearch.setOnGetRoutePlanResultListener(this.getRoutePlanResultListener); } public void routePlan(PlanNode startNode, PlanNode endNode){ mRoutePlanSearch.drivingSearch((new DrivingRoutePlanOption()) .from(startNode).to(endNode) .policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_TIME_FIRST) .trafficPolicy(DrivingRoutePlanOption.DrivingTrafficPolicy.ROUTE_PATH_AND_TRAFFIC)); }}规划线路后需要将实时路况索引保存,为后面画图需要
// 设置路段实时路况索引 ListallStep = selectedRouteLine.getAllStep(); mTrafficTextureIndexList.clear(); for (int j = 0; j < allStep.size(); j++) { if (allStep.get(j).getTrafficList() != null && allStep.get(j).getTrafficList().length > 0) { for (int k = 0; k < allStep.get(j).getTrafficList().length; k++) { mTrafficTextureIndexList.add(allStep.get(j).getTrafficList()[k]); } } }
要将路线规划的路线上的路段再细分(切割),这样小车移动才会平滑
/** * 将规划好的路线点进行截取 * 参考百度给的小车平滑轨迹移动demo实现。(循环的算法不太懂) * @param routeLine * @param distance * @return */ private ArrayListdivideRouteLine(ArrayList routeLine, double distance) { // 截取后的路线点的结果集 ArrayList result = new ArrayList<>(); mNewTrafficTextureIndexList.clear(); for (int i = 0; i < routeLine.size() - 1; i++) { final LatLng startPoint = routeLine.get(i); final LatLng endPoint = routeLine.get(i + 1); double slope = getSlope(startPoint, endPoint); // 是不是正向的标示 boolean isYReverse = (startPoint.latitude > endPoint.latitude); boolean isXReverse = (startPoint.longitude > endPoint.longitude); double intercept = getInterception(slope, startPoint); double xMoveDistance = isXReverse ? getXMoveDistance(slope, distance) : -1 * getXMoveDistance(slope, distance); double yMoveDistance = isYReverse ? getYMoveDistance(slope, distance) : -1 * getYMoveDistance(slope, distance); ArrayList temp1 = new ArrayList<>(); for (double j = startPoint.latitude, k = startPoint.longitude; !((j > endPoint.latitude) ^ isYReverse) && !((k > endPoint.longitude) ^ isXReverse); ) { LatLng latLng = null; if (slope == Double.MAX_VALUE) { latLng = new LatLng(j, k); j = j - yMoveDistance; } else if (slope == 0.0) { latLng = new LatLng(j, k - xMoveDistance); k = k - xMoveDistance; } else { latLng = new LatLng(j, (j - intercept) / slope); j = j - yMoveDistance; } final LatLng finalLatLng = 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); // 终点 } } return result; }
最后是开启子线程,对小车状态进行更新(车头方向和小车位置)
/** * 循环进行移动逻辑 */ public void moveLooper() { moveThread = new Thread() { public void run() { Thread thisThread = Thread.currentThread(); while (!exit) { for (int i = 0; i < latLngs.size() - 1; ) { if (exit) { break; } for (int p = 0; p < latLngs.size() - 1; p++) { // 这是更新索引的条件,这里总是为true // 实际情况可以是:当前误差小于5米 DistanceUtil.getDistance(mCurrentLatLng, latLngs.get(p)) <= 5) // mCurrentLatLng 这个小车的当前位置得自行获取得到 if (true) {// 实际情况的索引更新 mIndex = p; mIndex++; // 模拟就是每次加1 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(mContext, "当前索引:" + mIndex, Toast.LENGTH_SHORT).show(); } }); break; } } // 改变循环条件 i = mIndex + 1; if (mIndex >= latLngs.size() - 1) { exit = true; break; } // 擦除走过的路线 int len = mNewTrafficTextureIndexList.subList(mIndex, mNewTrafficTextureIndexList.size()).size(); Integer[] integers = mNewTrafficTextureIndexList.subList(mIndex, mNewTrafficTextureIndexList.size()).toArray(new Integer[len]); int[] index = new int[integers.length]; for (int x = 0; x < integers.length; x++) { index[x] = integers[x]; } if (index.length > 0) { mPolyline.setIndexs(index); mPolyline.setPoints(latLngs.subList(mIndex, latLngs.size())); } // 这里是小车的当前点和下一个点,用于确定车头方向 final LatLng startPoint = latLngs.get(mIndex); final LatLng endPoint = latLngs.get(mIndex + 1); mHandler.post(new Runnable() { @Override public void run() { // 更新小车的位置和车头的角度 if (mMapView == null) { return; } mMoveMarker.setPosition(startPoint); mMoveMarker.setRotate((float) getAngle(startPoint, endPoint)); } }); try { // 控制线程更新时间间隔 thisThread.sleep(TIME_INTERVAL); } catch (InterruptedException e) { e.printStackTrace(); } } } } }; // 启动线程 moveThread.start(); }以上是"如何使用百度地图实现小车规划路线后平滑移动功能"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
小车
路线
规划
地图
移动
平滑
更新
文档
索引
线程
线路
车头
功能
位置
内容
实时
方向
篇文章
路况
路段
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库与电子商务系统
软件开发 职业规划
消除网络安全广告
量化交易云服务器部署
人社局网络安全证书
怎么设置数据库输入记录
网络安全知识温馨提示语
地质数据库建立方案
小学生网络安全知识教育心得
专业软件开发机构
数据库导出乱码
oem12c数据库密码
服务器安卓模拟器
重庆服务器电源哪种好
数据库实验六数据库的安全管理
学java还是网络安全
数据库实体与属性图
在吉利软件开发工作怎么样
00后网络安全
windows系统下数据库
wow人数最多服务器
路南网络安全生产
人口健康数据库
加快统计系统网络安全建设
全光网络技术现状
儿童网络安全拍手歌歌词
网站服务器运维教程
目前网络安全的工作内容
软件开发过程的主要步骤
网络安全知识竞赛答题答案