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
