1. 程式人生 > >百度地圖SDK導航(路徑規劃+實時導航)

百度地圖SDK導航(路徑規劃+實時導航)

裡面的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的時候 都可以再次進行路徑規劃(因為你的位置會變動)