摘要:公交導航,即在市內坐公交,從哪兒去哪兒,好比從王府井到西單。有多種公交策略能夠選擇,好比少步行,不坐地鐵等。html
----------------------------------------------------------------------
系列閱讀:
一、【百度地圖-安卓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 java
六、【「零起點」--百度地圖手機SDK】如何查詢公交線路?如北京的104路android
http://www.cnblogs.com/milkmap/archive/2012/06/27/2554843.html
-----------------------------------------------------------------------api
先按照第6章的內容,搭好環境與代碼框架。接下來,只須要修改少許代碼,便可實現公交導航功能。app
1、公交導航接口transitSearch框架
因爲公交導航只支持市內公交,因此,設置城市是必須的。ide
目前還不支持跨城公交,未來會考慮增長火車信息。函數
另外,駕車導航,支持跨城駕車。佈局
myMKSearch.transitSearch("北京", start, end); // 必須設置城市名。
該接口支持檢索起點和終點爲關鍵字,或者座標。但請注意,都必須使用到MKPlanNode接口。ui
MKPlanNode start = new MKPlanNode(); start.name = "王府井";//關鍵字方式//start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//經緯度方式
接下來設置公交策略。有以下幾種策略:
EBUS_TIME_FIRST:時間優先;
EBUS_TRANSFER_FIRST:少換乘;
EBUS_WALK_FIRST:少步行;
EBUS_NO_SUBWAY: 不乘坐地鐵。
myMKSearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); //不乘坐地鐵
2、設置回調函數
回調函數onGetTransitRouteResult裏,須要設置以下內容:
TransitOverlay transitOverlay = new TransitOverlay(YingTransitActivity.this, mMapView);//建立公交覆蓋物對象 transitOverlay.setData(res.getPlan(0));// 此處僅展現一個方案做爲示例mMapView.getOverlays().add(transitOverlay);//添加覆蓋物到地圖上mMapView.invalidate(); //刷新地圖
3、運行結果
4、所有源代碼
package com.baidu.yingTransit; 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.MKPoiInfo; 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 YingTransitActivity extends MapActivity { /** 申明變量 **/ BMapManager mBMapMan = null; MapView mMapView = null; MKSearch myMKSearch = null; //POI搜索變量申明 /** 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(14); //設置地圖zoom級別 myMKSearch = new MKSearch(); //初始化 myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int error) { } public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { if (res == null) {return;} TransitOverlay transitOverlay = new TransitOverlay(YingTransitActivity.this, mMapView); // 此處僅展現一個方案做爲示例 transitOverlay.setData(res.getPlan(0)); mMapView.getOverlays().add(transitOverlay); mMapView.invalidate(); //刷新地圖 } public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } public void onGetAddrResult(MKAddrInfo res, int error) { } public void onGetBusDetailResult(MKBusLineResult result, int error) { } @Override public void onGetSuggestionResult(MKSuggestionResult result, int error) { } }); /** 公交導航查詢 **/ MKPlanNode start = new MKPlanNode(); start.name = "王府井";//關鍵字方式 //start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//經緯度方式 MKPlanNode end = new MKPlanNode(); end.name = "西單"; //關鍵詞方式 //end.pt = new GeoPoint(40057031, 116307852);//經緯度方式 myMKSearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); //公交策略:EBUS_TIME_FIRST:時間優先;EBUS_TRANSFER_FIRST:少換乘;EBUS_WALK_FIRST:少步行;EBUS_NO_SUBWAY: 非地鐵 myMKSearch.transitSearch("北京", start, end); // 必須設置城市名。start和end可經過關鍵字,座標兩種方式指定,但必須使用MKPlanNode接口。 } 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(); } }