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

摘要:公交導航,即在市內坐公交,從哪兒去哪兒,好比從王府井到西單。有多種公交策略能夠選擇,好比少步行,不坐地鐵等。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();
    }
    
}
相關文章
相關標籤/搜索