摘要:駕車導航支持市內駕車,和跨城駕車。起點和終點的輸入,支持關鍵字和經緯度兩種形式。駕車一樣有多種駕車策略。另外,步行導航與駕車導航相似,只須要更換接口名稱便可。
----------------------------------------------------------------------
系列閱讀:
一、【百度地圖-安卓SDK】從頭開始寫android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html
二、【「零起點」--百度地圖手機SDK】如何建立一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html
三、【「零起點」--百度地圖手機SDK】如何使用離線地圖?
http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html
四、【「零起點」--百度地圖手機SDK】如何添加地圖圖層+按鈕事件+水平垂直佈局?
http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html
五、【「零起點」--百度地圖手機SDK】如何進行三種POI搜索?
http://www.cnblogs.com/milkmap/archive/2012/06/05/2536764.html
六、【「零起點」--百度地圖手機SDK】如何查詢公交線路?如北京的104路
http://www.cnblogs.com/milkmap/archive/2012/06/27/2554843.htmlhtml
七、【「零起點」--百度地圖手機SDK】如何查詢從西單到王府井的公交導航?java
http://www.cnblogs.com/milkmap/archive/2012/07/03/2574713.html
-----------------------------------------------------------------------android
1、駕車導航接口api
申明變量和初始化搜索服務接口app
MapView mMapView = null; //activity內頂部書寫myMKSearch = new MKSearch(); //實例化,oncreate函數裏書寫
駕車導航接口ide
一、起點和終點是string函數
這裏須要注意的是,若是你採起的是string形式的起點和終點,就必須設置城市,且必需要保證string是POI信息點的title。不然,會搜索不到結果。佈局
建議使用POI搜索接口,先找到POI點,再取它的title或者point。ui
MKPlanNode start = new MKPlanNode(); MKPlanNode end = new MKPlanNode(); start.name = "國家體育場北路"; end.name = "重慶朝天門廣場";myMKSearch.drivingSearch("北京", start, "重慶", end);
二、若是起點和終點直接是point形式,則能夠不用設置城市,也不用這個point必須是POI數據。this
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);
三、駕車策略有以下幾種
ECAR_TIME_FIRST:時間優先;
ECAR_DIS_FIRST:距離最短;
ECAR_FEE_FIRST:費用最少
myMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);//駕車策略:時間優先、費用最少或距離最短
2、回調函數設置
回調函數裏,只要先判斷「是否有搜索結果」。而後搜索到結果以後,須要「刷新地圖」。
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(); //刷新地圖 } ...... });
3、運行結果
4、所有源代碼
我這裏只給出了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(); } }