Android學習筆記之使用百度地圖實現路線規划+公交信息檢索


PS:裝了個deepin,感覺真的很高大上.

 

學習內容:

1.公交信息檢索

2.路線規划

 

  關於百度地圖的開發也就這么多了.重要的部分也就那么些.原本打算搞到poi搜索就算了,不過看到了這兩個方面還是忍不住去涉獵一下.其實實現的模式和poi搜索沒有什么太多的區別.只要將數據信息發送給百度地圖的服務器,我們對服務器的返回數據進行處理就可以了.

1.公交信息檢索

  公交信息檢索,顧名思義就是搜索大巴和地鐵.實現的過程和poi搜索沒什么兩樣,一般都是現實例化對象,然后設置檢索的參數和檢索數據的監聽.設置完這兩個東西后,開始發出檢索請求.然后等待服務器段處理完數據信息之后,我們客戶端對數據信息進行處理就可以了.(com.baidu.mapapi.search.busline)

  通過使用上面的api就可以實現公交信息檢索.

  還有一點就是公交路線查詢也是基於Poi搜索的.當我們完成了Poi搜索之后,才能夠實現公交路線的搜索.實現Poi搜索就非常的簡單了,這里就不進行細說了.只是說一下Poi結果查詢之后回調函數的一些細節.

OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {
        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            if (poiResult == null
                    || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 沒有找到檢索結果
                Toast.makeText(BusLineSearchActivity.this, "未找到結果",
                        Toast.LENGTH_LONG).show();
                return;
            }

            if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 檢索結果正常返回
                // 遍歷所有poi,找到類型為公交線路的poi
                buslineIdList.clear();
                for (PoiInfo poi : poiResult.getAllPoi()) {
                    if (poi.type == PoiInfo.POITYPE.BUS_LINE
                            || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
                        buslineIdList.add(poi.uid);
                    }
                }
                searchBusline();
            }
        }

        @Override
        public void onGetPoiDetailResult(PoiDetailResult arg0) {

        }
    };

   回調函數返回的結果會有各種各樣的poi,因此我們需要將這些poi進行遍歷,從而查找出我們想要的公交站點.因此這里使用了一個判斷條件去保存這些公交信息.這個就是來完成判斷的過程.完成了這些后,就可以對公交線路進行相關查詢了.

  if (poi.type == PoiInfo.POITYPE.BUS_LINE || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
        buslineIdList.add(poi.uid);
  }

  首先是實例化對象.和poi搜索如出一轍,都是使用newInstance()去實例化對象.那么BusLineSearch通過實例化對象去完成公交信息的檢索.通過向服務端發送請求,然后獲取數據信息就可以了.

busLineSearch = BusLineSearch.newInstance();

  然后就是綁定監聽事件.當服務器對數據處理完畢之后,作為回調函數,將處理完的數據信息返回給客戶端.然后客戶端對數據信息進行相關處理.從而獲取服務端想要的數據信息.

OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
        @Override
        public void onGetBusLineResult(BusLineResult busLineResult) {

            if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(BusLineSearchActivity.this, "抱歉,未找到結果",
                        Toast.LENGTH_SHORT).show();
            } else {
                bdMap.clear();
                BusLineOverlay overlay = new MyBuslineOverlay(bdMap);// 用於顯示一條公交詳情結果的Overlay
                overlay.setData(busLineResult);
                overlay.addToMap();// 將overlay添加到地圖上
                overlay.zoomToSpan();// 縮放地圖,使所有overlay都在合適的視野范圍內
                bdMap.setOnMarkerClickListener(overlay);
                // 公交線路名稱
                Toast.makeText(BusLineSearchActivity.this,
                        busLineResult.getBusLineName(), Toast.LENGTH_SHORT)
                        .show();
            }
        }
    };

  監聽的設置非常的簡單.BusLineResult作為回調函數的參數.然后我們可以獲取到公交線路站點信息.同時我們還可以對這些站點信息進行處理.設置站點的監聽事件.站點的數據信息獲取展示在Map上也是通過Overlay去實現的.我們只需要調用Overlay內部的函數,就可以把所有獲取到的結果展示在Map上.

class MyBuslineOverlay extends BusLineOverlay {

        public MyBuslineOverlay(BaiduMap arg0) {
            super(arg0);
        }
        /**
         * 站點點擊事件
         */
        @Override
        public boolean onBusStationClick(int arg0) {
            //
            MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0);  //獲取被點擊的Marker
            bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));  //更新地圖上的數據信息.
            return true;
        }
    }

  同時我們最后配置上查詢的相關參數,然后發送請求就可以完成信息的查詢了.參數的配置則是通過BusLineSearchOptions去完成配置.公交信息查詢的參數則需要配置兩個屬性.一個是城市參數.一個則是uid.這里的uid表示的是一個標示符(唯一).不是表示公交站點的車號.這點我們需要注意.以下則是通過傳遞完參數之后進行信息的查詢.

busLineSearch.searchBusLine((new BusLineSearchOption().city(city).uid(buslineIdList.get(buslineIndex))));  

2.路線規划

  路線規划則是根據指定路線,然后設置出最佳路線提供給用戶,使得用戶能夠以最快的時間從出發地到達目的地,路線規划分成三種規划.駕車,換乘,步行三種方式的規划.

  規划同時包含了四種策略:躲避擁堵,最短距離,較少費用,時間優先這四大策略.四種策略以枚舉的形式被封裝起來.這樣我們就可以直接在路線規划當中設置策略.然后發送請求.百度地圖服務器會根據我們設置的策略進行相應的處理.

  駕車路線查詢實現

   /**
     * 駕車線路查詢 下拉菜單的四個屬性:躲避擁堵,最短距離,較少費用,時間優先
     */
    private void drivingSearch(int index) {
        DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();
        drivingOption.policy(DrivingPolicy.values()[drivingSpinner.getSelectedItemPosition()]);// 設置駕車路線策略.使用了一個下拉菜單去獲取四種策略的一種.
        drivingOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));// 設置起點
        drivingOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));// 設置終點
        routePlanSearch.drivingSearch(drivingOption);// 發起駕車路線規划
    }

  簡單的說一下內部的函數: from(PlanNode from)設置起始點函數. passBy(java.util.List<PlanNode>wayPoints)設置途經點函數  

  policy(DrivingRoutePlanOption.DrivingPolicy policy)設置駕車路線規划策略. to(PlanNode to)要到達的位置

  設置起始點,經過點,終點的時候需要傳遞PlanNode對象.實例化PlanNode對象的時候,一種方式是通過傳遞城市和地名去實例化.另一種方式則是通過設置經緯度的方式去實例化對象.

  換乘路線查詢實現

  換乘路線其實一般指的就是地鐵或者是大巴.這些東西途徑時需要實現換乘.

   /**
     * 換乘路線查詢
     */
    private void transitSearch(int index) {
        TransitRoutePlanOption transitOption = new TransitRoutePlanOption();
        transitOption.city("淄博");// 設置換乘路線規划城市,起終點中的城市將會被忽略
        transitOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));
        transitOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));
        transitOption.policy(TransitPolicy.values()[transitSpinner.getSelectedItemPosition()]);// 設置換乘策略
        routePlanSearch.transitSearch(transitOption);
    }

    步行路線查詢實現:

   /**
     * 步行路線查詢
     */
    private void walkSearch() {
        WalkingRoutePlanOption walkOption = new WalkingRoutePlanOption();
        walkOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));
        walkOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));
        routePlanSearch.walkingSearch(walkOption);
    }

    設置的方式其實都特別的簡單,設置完相關方式之后需要設置相關的監聽事件用於回調.內部的具體實現過程我就不去實現了,在最后我會再提供一個demo下載.大家可以下載下來進行相關的研究.

    /**
     * 路線規划結果回調
     */
    OnGetRoutePlanResultListener routePlanResultListener = new OnGetRoutePlanResultListener() {

        /**
         * 步行路線結果回調
         */
        @Override
        public void onGetWalkingRouteResult(
                WalkingRouteResult walkingRouteResult) {
            
        }

        /**
         * 換成路線結果回調
         */
        @Override
        public void onGetTransitRouteResult(
                TransitRouteResult transitRouteResult) {
            
        }

        /**
         * 駕車路線結果回調 查詢的結果可能包括多條駕車路線方案
         */
        @Override
        public void onGetDrivingRouteResult(
                DrivingRouteResult drivingRouteResult) {
        
        }
    };

   最后就是實例化對象,然后發送請求就可以了,服務端處理完數據信息之后,通過回調就可以把數據回傳了.

  最后放一個demo:http://files.cnblogs.com/files/RGogoing/BDMap_1.rar

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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