【移動應用開發(fā)技術】百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能_第1頁
【移動應用開發(fā)技術】百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能_第2頁
【移動應用開發(fā)技術】百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能_第3頁
【移動應用開發(fā)技術】百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能_第4頁
【移動應用開發(fā)技術】百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能

在下給大家分享一下百度地圖如何實現(xiàn)小車規(guī)劃路線后平滑移動功能,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!實現(xiàn)效果代碼下載下載鏈接下面是實現(xiàn)的關鍵步驟集成百度地圖怎么集成自然是看百度地圖開發(fā)平臺提供的文檔。文檔連接規(guī)劃線路看百度地圖的文檔,寫一個規(guī)劃線路的工具類(駕車的)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));

}

}規(guī)劃線路后需要將實時路況索引保存,為后面畫圖需要//

設置路段實時路況索引

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]);

}

}

}要將路線規(guī)劃的路線上的路段再細分(切割),這樣小車移動才會平滑/**

*

將規(guī)劃好的路線點進行截取

*

參考百度給的小車平滑軌跡移動demo實現(xiàn)。(循環(huán)的算法不太懂)

*

@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;

}最后是開啟子線程,對小車狀態(tài)進行更新(車頭方向和小車位置)/**

*

循環(huán)進行移動邏輯

*/

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;

}

}

//

改變循環(huán)條件

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論