版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 砌墻工程夜間施工合同
- 醫(yī)療健康合作項目協(xié)議模板
- 政府采購按利服務協(xié)議
- 股票配資告知義務協(xié)議模板
- 工程砌墻工期延長申請合同
- 第26課《詩詞五首:春望》教案+2024-2025學年統(tǒng)編版語文八年級上冊
- 按揭房產稅費服務協(xié)議
- 2024年派出所內勤的工作總結
- 物聯(lián)網服務協(xié)議
- 茶葉代銷協(xié)議模板
- 燃氣經營許可申請
- MOOC 英文學術寫作實戰(zhàn)-北京大學 中國大學慕課答案
- 非傳統(tǒng)安全概論課件
- 《新時代“一帶一路”的戰(zhàn)略解讀與機遇》題庫
- 2024年餐廳服務員(三級)職業(yè)鑒定考試題庫大全-上(單選題)
- (高清版)WST 442-2024 臨床實驗室生物安全指南
- 2024年“民用無人機及多旋翼無人機”駕駛員操控員技能與理論知識考試題庫含答案
- 生物信息學(上海海洋大學)智慧樹知到期末考試答案2024年
- 教科版小學科學二年級上冊教案(全冊)教學設計
- 人美版七年級下冊《美術》單元作業(yè)設計
- 2024年考研管理類聯(lián)考綜合能力真題及答案
評論
0/150
提交評論