【百度地圖-安卓SDK】如何實現跨城駕車導航?例如從重慶到北京。


摘要:駕車導航支持市內駕車,和跨城駕車。起點和終點的輸入,支持關鍵字和經緯度兩種形式。駕車同樣有多種駕車策略。另外,步行導航與駕車導航類似,只需要更換接口名稱即可。
----------------------------------------------------------------------
系列閱讀:
1、【百度地圖-安卓SDK】從頭開始寫android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html 
2、【“零起點”--百度地圖手機SDK】如何創建一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html 
3、【“零起點”--百度地圖手機SDK】如何使用離線地圖?
http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html 
4、【“零起點”--百度地圖手機SDK】如何添加地圖圖層+按鈕事件+水平垂直布局?
http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html 
5、【“零起點”--百度地圖手機SDK】如何進行三種POI搜索?
http://www.cnblogs.com/milkmap/archive/2012/06/05/2536764.html 
6、【“零起點”--百度地圖手機SDK】如何查詢公交線路?如北京的104路
http://www.cnblogs.com/milkmap/archive/2012/06/27/2554843.html

7、【“零起點”--百度地圖手機SDK】如何查詢從西單到王府井的公交導航?

http://www.cnblogs.com/milkmap/archive/2012/07/03/2574713.html 
-----------------------------------------------------------------------

 

一、駕車導航接口

 

申明變量和初始化搜索服務接口

MapView mMapView = null;  //activity內頂部書寫

myMKSearch = new MKSearch();  //實例化,oncreate函數里書寫

 

駕車導航接口

 

1、起點和終點是string

這里需要注意的是,如果你采取的是string形式的起點和終點,就必須設置城市,且必須要保證string是POI信息點的title。否則,會搜索不到結果。

建議使用POI搜索接口,先找到POI點,再取它的title或者point。

MKPlanNode start = new MKPlanNode();
MKPlanNode end = new MKPlanNode();
start.name = "國家體育場北路";
end.name = "重慶朝天門廣場";
myMKSearch.drivingSearch("北京", start, "重慶", end);

 

2、如果起點和終點直接是point形式,則可以不用設置城市,也不用這個point必須是POI數據。

MKPlanNode start = new MKPlanNode();
MKPlanNode end = new MKPlanNode();
start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
end.pt = new GeoPoint(40057031, 116307852);
mMKSearch.drivingSearch(null, start, null, end);

 

3、駕車策略有如下幾種

 ECAR_TIME_FIRST:時間優先;

ECAR_DIS_FIRST:距離最短;

ECAR_FEE_FIRST:費用最少

myMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);//駕車策略:時間優先、費用最少或距離最短

 

二、回調函數設置

回調函數里,只要先判斷“是否有搜索結果”。然后搜索到結果之后,需要“刷新地圖”。

  myMKSearch.init(mBMapMan, new MKSearchListener(){
            public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {
                if (error != 0 || res == null) {
                    Toast.makeText(DrivingActivity.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show();
                    return;
                }
                 RouteOverlay routeOverlay = new RouteOverlay(DrivingActivity.this, mMapView);
                 routeOverlay.setData(res.getPlan(0).getRoute(0));// 此處僅展示一個方案作為示例
                 mMapView.getOverlays().add(routeOverlay);//添加路線覆蓋物
                 mMapView.invalidate();  //刷新地圖
            }
......        
        });        

 

 

三、運行結果

 

 

四、全部源代碼

我這里只給出了java的代碼,其他文件的修改需要參考第二章《如何創建一張地圖》

package com.baidu.driving;

import android.app.Activity;
import android.os.Bundle;

/** 引入import **/
import java.util.ArrayList;
import java.util.List;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
 
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.LocationListener;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKBusLineResult;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MKLocationManager;
import com.baidu.mapapi.MKPlanNode;
import com.baidu.mapapi.MKPoiResult;
import com.baidu.mapapi.MKSearch;
import com.baidu.mapapi.MKSearchListener;
import com.baidu.mapapi.MKSuggestionResult;
import com.baidu.mapapi.MKTransitRouteResult;
import com.baidu.mapapi.MKWalkingRouteResult;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.MyLocationOverlay;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.PoiOverlay;
import com.baidu.mapapi.RouteOverlay;
import com.baidu.mapapi.TransitOverlay;
public class DrivingActivity extends MapActivity {
    /** 申明變量 **/
    BMapManager mBMapMan = null;
    MKSearch myMKSearch = null;    //POI搜索
    MapView mMapView = null;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        /** 創建地圖 **/
        mBMapMan = new BMapManager(getApplication());
        mBMapMan.init("1713A92A7A0C854D1B8717670EF8B6CA75696567", null);
        super.initMapActivity(mBMapMan);
         
        mMapView = (MapView) findViewById(R.id.bmapsView);//地圖控件,不添加的話,就不用寫。
        mMapView.setBuiltInZoomControls(true);  //設置啟用內置的縮放控件
        MapController mMapController = mMapView.getController();  // 得到mMapView的控制權,可以用它控制和驅動平移和縮放
        GeoPoint point = new GeoPoint((int) (39.915 * 1E6),
                (int) (116.404 * 1E6));  //用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
        mMapController.setCenter(point);  //設置地圖中心點
        mMapController.setZoom(5);    //設置地圖zoom級別     
        myMKSearch = new MKSearch();  //實例化
        
        /** 回調函數 **/        
        myMKSearch.init(mBMapMan, new MKSearchListener(){
            @Override
            public void onGetPoiResult(MKPoiResult result, int type, int iError) {
            }
            public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {
                if (error != 0 || res == null) {
                    Toast.makeText(DrivingActivity.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show();
                    return;
                }
                 RouteOverlay routeOverlay = new RouteOverlay(DrivingActivity.this, mMapView);
                 routeOverlay.setData(res.getPlan(0).getRoute(0));// 此處僅展示一個方案作為示例
                 mMapView.getOverlays().add(routeOverlay);//添加路線覆蓋物
                 mMapView.invalidate();  //刷新地圖
            }
            public void onGetTransitRouteResult(MKTransitRouteResult res,int error) {
            }
            public void onGetWalkingRouteResult(MKWalkingRouteResult res,int error) {
            }
            public void onGetAddrResult(MKAddrInfo res, int error) {
            }
            @Override
            public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {            
            }
            @Override
            public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {            
            }            
        });        
      
      
      MKPlanNode start = new MKPlanNode();
      MKPlanNode end = new MKPlanNode();
      start.name = "國家體育場北路";
      end.name = "重慶朝天門廣場";
      myMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);//駕車策略:時間優先、費用最少或距離最短
      myMKSearch.drivingSearch("北京", start, "重慶", end);
    }
    
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
    
    /** 引入方法管理API **/
    @Override
    protected void onDestroy() {
        if (mBMapMan != null) {
            mBMapMan.destroy();
            mBMapMan = null;
        }
        super.onDestroy();
    }
    @Override
    protected void onPause() {
        if (mBMapMan != null) {
            mBMapMan.stop();
        }
        super.onPause();
    }
    @Override
    protected void onResume() {
        if (mBMapMan != null) {
            mBMapMan.start();
        }
        super.onResume();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM