版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能
在下给大家分享一下百度地图如何实现小车规划路线后平滑移动功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实现效果代码下载下载链接下面是实现的关键步骤集成百度地图怎么集成自然是看百度地图开发平台提供的文档。文档连接规划线路看百度地图的文档,写一个规划线路的工具类(驾车的)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));
}
}规划线路后需要将实时路况索引保存,为后面画图需要//
设置路段实时路况索引
List<DrivingRouteLine.DrivingStep>
allStep
=
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
ArrayList<LatLng>
divideRouteLine(ArrayList<LatLng>
routeLine,
double
distance)
{
//
截取后的路线点的结果集
ArrayList<LatLng>
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<LatLng>
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
star
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 3 Body parts and feelings Lesson 16 公开课教学课件【七年级英语上册(冀教版)】
- 市政工程促进城市科技创新
- 2024年火电电力职业技能鉴定考试-锅炉、容器管理人员笔试参考题库含答案
- 2024年火电电力职业技能鉴定考试-换流站安规笔试参考题库含答案
- 四年级下册我的奇思妙想作文会飞的鞋子
- 2024年河南住院医师-河南住院医师内科笔试参考题库含答案
- 航空仿真设备项目商业计划书及实施方案|瑞克咨询|2024年编制|
- 家具成套生产线项目可行性研究报告及运营方案|瑞克咨询|2024年编|
- 闭式冷却塔项目商业计划书及实施方案|瑞克咨询|2024年编|
- 风力提水机组项目市场研究报告及运营管理方案|瑞克咨询|2024年编制|
- 提高精神科封闭式病房危险物品课件
- 三月三主题活动目标小班
- 口腔门诊常见病历模板汇总
- 【钢铁冶炼】-高炉冶炼工艺炉渣碱度
- 3的倍数特征(说课稿)
- 矩形截面偏心受压构件非对称配筋截面设计建筑规范
- 古巴导弹危机
- JJF 1977-2022 水中挥发酚在线监测仪校准规范
- 2022年05月四川省宜宾三江汇海科技有限公司招聘工作人员笔试题库含答案解析
- 《李嘉诚传 全集 》读书笔记思维导图PPT模板下载
- 2023年小学六年级语文趣味知识竞赛试题
评论
0/150
提交评论