【“零起點”--百度地圖手機SDK】如何查詢公交線路?如北京的104路


摘要:想要查詢北京市的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();
    }
    
}


免責聲明!

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



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