【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能_第1页
【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能_第2页
【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能_第3页
【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能_第4页
【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】百度地图如何实现小车规划路线后平滑移动功能

在下给大家分享一下百度地图如何实现小车规划路线后平滑移动功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实现效果代码下载下载链接下面是实现的关键步骤集成百度地图怎么集成自然是看百度地图开发平台提供的文档。文档连接规划线路看百度地图的文档,写一个规划线路的工具类(驾车的)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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论