如何使用百度地图实现小车规划路线后平滑移动功能
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍如何使用百度地图实现小车规划路线后平滑移动功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!文章目的项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写
千家信息网最后更新 2026年11月03日如何使用百度地图实现小车规划路线后平滑移动功能
这篇文章主要介绍如何使用百度地图实现小车规划路线后平滑移动功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
文章目的
项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写的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安全错误
数据库的锁怎样保障安全
互联网科技有限公司
互联网科技股
互联网新科技
江苏根荣互联网科技
北京路客互联网科技有限公司
深圳科技互联网
互联网科技公司发展
西安互联网科技
互联网 科技创业
互联网科技媒体
互联网科技大会
互联网科技素材视频竖屏
中正互联网科技招聘
科技大学互联网专业好不好
互联网实体化科技化
茂名市互联网科技产业园
元气玛特互联网科技公司是外包吗
济南小医互联网科技有限公司招聘
互联网科技职业技能培训学校
北京瑞云互联网科技有限公司
华服互联网科技怎么样
济南和联互联网科技有限公司
湖南洣水互联网科技有限公司扣款
互联网为啥属于高科技
宇信科技在杭州互联网排第几
郑州欣桑互联网科技有限公司
九思连强互联网电子科技有限公司
互联网对科技影响
青岛互联网科技园
广州全民伙伴互联网科技有限公司