百度地圖SDK導航(路徑規劃+實時導航)
阿新 • • 發佈:2019-02-10
裡面的demo寫的非常詳細 ,我主要說一下我個人遇到的問題以及對它的理解:
首先貼核心程式碼:
【路徑規劃】
private void startCalcRoute(int netmode) {
// 獲取輸入的起終點
RoutePlanNode startNode = new RoutePlanNode(sX, sY,
RoutePlanNode.FROM_MAP_POINT, eXString, eXString);
// 終點
RoutePlanNode endNode = new RoutePlanNode(eX, eY,
RoutePlanNode.FROM_MAP_POINT, eYString, eYString);
// 將起終點新增到nodeList
ArrayList<RoutePlanNode> nodeList = new ArrayList<RoutePlanNode>(2);
nodeList.add(startNode);
nodeList.add(endNode);
BNRoutePlaner.getInstance().setObserver(
new RoutePlanObserver(this, null));
// 設定算路方式
BNRoutePlaner.getInstance().setCalcMode(
NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME);
// 設定算路結果回撥
BNRoutePlaner.getInstance()
.setRouteResultObserver(mRouteResultObserver);
// 設定起終點並算路
boolean ret = BNRoutePlaner.getInstance().setPointsToCalcRoute(
nodeList, NL_Net_Mode.NL_Net_Mode_OnLine);
if (!ret) {
Toast.makeText(this , "規劃失敗", Toast.LENGTH_SHORT).show();
}
}
這裡sx,sy,ex,sy是起點跟終點的緯度經度,這裡注意的是它們的取值都是整型,也就是說例如緯度為:28.242345 那要將它轉化成2824234 把最後的那個5去掉。
【實時導航】
百度實時導航給了一個很好的工具類,在官網demo裡面的BNavigatorActivity.java
可以直接在別的類裡面呼叫
private void startNavi(boolean isReal) {
if (mRoutePlanModel == null) {
Toast.makeText(this, "請先算路!", Toast.LENGTH_LONG).show();
return;
}
// 獲取路線規劃結果起點
RoutePlanNode startNode = mRoutePlanModel.getStartNode();
// 獲取路線規劃結果終點
RoutePlanNode endNode = mRoutePlanModel.getEndNode();
if (null == startNode || null == endNode) {
return;
}
// 獲取路線規劃算路模式
int calcMode = BNRoutePlaner.getInstance().getCalcMode();
Bundle bundle = new Bundle();
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_VIEW_MODE,
BNavigator.CONFIG_VIEW_MODE_INFLATE_MAP);
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_CALCROUTE_DONE,
BNavigator.CONFIG_CLACROUTE_DONE);
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_START_X,
startNode.getLongitudeE6());
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_START_Y,
startNode.getLatitudeE6());
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_END_X, endNode.getLongitudeE6());
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_END_Y, endNode.getLatitudeE6());
bundle.putString(BNavConfig.KEY_ROUTEGUIDE_START_NAME,
mRoutePlanModel.getStartName(this, false));
bundle.putString(BNavConfig.KEY_ROUTEGUIDE_END_NAME,
mRoutePlanModel.getEndName(this, false));
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_CALCROUTE_MODE, calcMode);
if (!isReal) {
// 模擬導航
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_LOCATE_MODE,
RGLocationMode.NE_Locate_Mode_RouteDemoGPS);
} else {
// GPS 導航
bundle.putInt(BNavConfig.KEY_ROUTEGUIDE_LOCATE_MODE,
RGLocationMode.NE_Locate_Mode_GPS);
}
Intent intent = new Intent(RoutePlanActivity.this,
BNavigatorActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
這裡遇到的問題就是 注意如果每次都要在resume時候再次路徑規劃的話 就直接把地圖初始化放在resume裡 這樣就可以實現 開啟的時候 接電話的時候 切換到其他的activity的時候 都可以再次進行路徑規劃(因為你的位置會變動)