摘要:想要查詢北京市的108路公交車經過什么地方?這一章將講解公交導航和查詢的接口。
----------------------------------------------------------------------
系列閱讀:
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
-----------------------------------------------------------------------
一、創建一張地圖
參考教程2:【“零起點”--百度地圖手機SDK】如何創建一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html
步驟溫習:
1、創建YingTransitActivity的安卓工程。
2、創建libs文件夾,放入jar文件。創建libs\armeabi文件夾,放入so文件。工程屬性里增加jar。
3、修改如下四個文件,
TransitActivity.java是展示地圖的主程序;
transit.Manfest里增加了使用權限和安卓版本支持;
main.xml里增加了地圖控件;
strings.xml里可以修改標題和文本控件的文字內容。
4、真機運行。
二、查詢104關鍵詞
分為三步:
第一、需要查詢104關鍵詞;
第二、回調函數里判斷POI結果為公交線路的,並返回uid;
第三、根據uid查詢公交線路詳情。
1、查詢104關鍵詞
因為是查詢整個城市內的公交線路,所以使用城市內查詢接口。
在activity里先申明變量
MKSearch myMKSearch = null; //POI搜索變量申明
再在oncreate函數里,對其進行初始化
myMKSearch = new MKSearch(); //初始化
最后進行POI查詢
myMKSearch.poiSearchInCity("北京", "104");
2、回調函數里得到公交線路的uid
POI查詢的結果有以下幾種類型:poi類型,0:普通點,1:公交站,2:公交線路,3:地鐵站,4:地鐵線路
在POI檢索的回調函數onGetPoiResult里,判斷POI查詢的結果類型,只返回公交線路的。
// 找到公交路線poi node MKPoiInfo curPoi = null; int totalPoiNum = result.getNumPois(); for( int idx = 0; idx < totalPoiNum; idx++ ) { curPoi = result.getPoi(idx); if ( 2 == curPoi.ePoiType ) { break; } }
然后在檢索的回調函數onGetPoiResult里進行公交線路的查詢:
myMKSearch.busLineSearch("北京", curPoi.uid);
3、使用uid查詢公交線路
最后,只需要在公交線路的回調函數onGetBusDetailResult里,進行輸出即可。
RouteOverlay routeOverlay = new RouteOverlay(YingTransitActivity.this, mMapView); // 此處僅展示一個方案作為示例 routeOverlay.setData(result.getBusRoute()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(routeOverlay); mMapView.invalidate(); mMapView.getController().animateTo(result.getBusRoute().getStart());
三、注意事項
查詢語句,最好寫在回調函數的后面。
以保證程序不會異常,而造成關閉。
myMKSearch.init(mBMapMan, new MKSearchListener(){}); //回調函數 myMKSearch.poiSearchInCity("北京", "104"); //POI查詢
四、全部源代碼:
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(12); //設置地圖zoom級別 myMKSearch = new MKSearch(); //初始化 /** 判斷是否有結果 **/ // if(myMKSearch == null) // { // Toast.makeText(this, "error", Toast.LENGTH_LONG).show(); // return; // } // Toast.makeText(this, "ok", Toast.LENGTH_LONG).show(); myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int error) { // 錯誤號可參考MKEvent中的定義 if (error != 0 || result == null) { Toast.makeText(YingTransitActivity.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show(); return; } // 找到公交路線poi node MKPoiInfo curPoi = null; int totalPoiNum = result.getNumPois(); for( int idx = 0; idx < totalPoiNum; idx++ ) { curPoi = result.getPoi(idx); if ( 2 == curPoi.ePoiType ) { break; } } myMKSearch.busLineSearch("北京", curPoi.uid); } public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { } public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } public void onGetAddrResult(MKAddrInfo res, int error) { } public void onGetBusDetailResult(MKBusLineResult result, int error) { if (error != 0 || result == null) { Toast.makeText(YingTransitActivity.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show(); return; } RouteOverlay routeOverlay = new RouteOverlay(YingTransitActivity.this, mMapView); // 此處僅展示一個方案作為示例 routeOverlay.setData(result.getBusRoute()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(routeOverlay); mMapView.invalidate(); mMapView.getController().animateTo(result.getBusRoute().getStart()); } @Override public void onGetSuggestionResult(MKSuggestionResult result, int error) { // TODO Auto-generated method stub } }); myMKSearch.poiSearchInCity("北京", "104"); //搜索104關鍵詞。放在回調函數之后,以保證正確返回。 } 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(); } }