[置頂] 百度地圖開發(五)之公交信息檢索 + 路線規劃
來源:程序員人生 發布時間:2015-03-19 08:18:11 閱讀次數:3101次
轉載請注明出處:
在上1篇blog中介紹過POI檢索的使用,本篇blog主要介紹公交信息檢索和線路計劃的內容。
公交信息檢索
實際上,公交信息檢索與POI檢索、在線建議檢索非常相似,也是把你需要檢索的信息發送給百度地圖服務器,然后解析得到的結果。
1般步驟:
1. 設置檢索參數
2. 添加檢索結果監聽器
3. 發起檢索
4. 解析返回結果
打開程序包com.baidu.mapapi.search.busline 

在BusLineSearchOption這個類中,我們看到1個參數是城市,另外一個是公眾線路uid。
1開始,我以為第2個參數是公交線號,代碼編寫終了去查詢的時候,總是出錯。后來仔細查看了api以后,發現不是公交線號,而是uid。uid我們在之前poi檢索的時候,曾見到過,它實際上即是1個id,是i1個唯1標識。
所以注意:公交信息檢索設置查詢參數時,第2個參數是uid。
所以進行公交信息檢索之前,需要先進行POI檢索。使用searchInCity()方法在每個城市內查詢公交線路號:
city = cityEt.getText().toString();
busline = buslineEt.getText().toString();
poiSearch.searchInCity((new PoiCitySearchOption()).city(city)
.keyword(busline));
得到poi檢索的結果時,在
PoiResult類中有通過
getAllPoi()獲得poi檢索結果。
@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) {// 檢索結果正常返回
// 得到檢索結果
}
}
此時如果直接取出PoiInfo中的uid的話,你會發現很多個。但是,我們都知道,1個公交線號最多有兩個線路(正向和反向)。所以我們需要挑選出是公交線路的uid。
在PoiInfo類中有個type字段:0:普通點、1:、公交站 2:、 公交線路 3:、地鐵站 4:地鐵線路
if (poi.type == PoiInfo.POITYPE.BUS_LINE
|| poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
buslineIdList.add(poi.uid);
}
通過判斷type,將正確的uid添加到1個list中。
得到了uid,就能夠結合城市參數,進行公交線路檢索了。
private void searchBusline() {
if (buslineIndex >= buslineIdList.size()) {
buslineIndex = 0;
}
if (buslineIndex >= 0 && buslineIndex < buslineIdList.size()
&& buslineIdList.size() > 0) {
boolean flag = busLineSearch
.searchBusLine((new BusLineSearchOption().city(city)
.uid(buslineIdList.get(buslineIndex))));
if (flag) {
Toast.makeText(BusLineSearchActivity.this, "檢索成功~", 1000)
.show();
} else {
Toast.makeText(BusLineSearchActivity.this, "檢索失敗~", 1000)
.show();
}
buslineIndex++;
}
}
/**
* 公交信息查詢結果監聽器
*/
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);// 用于顯示1條公交詳情結果的Overlay
overlay.setData(busLineResult);
overlay.addToMap();// 將overlay添加到地圖上
overlay.zoomToSpan();// 縮放地圖,使所有overlay都在適合的視野范圍內
bdMap.setOnMarkerClickListener(overlay);
// 公交線路名稱
Toast.makeText(BusLineSearchActivity.this,
busLineResult.getBusLineName(), Toast.LENGTH_SHORT)
.show();
}
}
};
BusLineResult用來存儲查詢得到的結果,它又兩個內部類和幾個普通函數:

我們可以通過這兩個內部類,得到自己想要的信息,這里就不在代碼里寫了。
我們照舊通過使用overlayutil包下的相干類(BusLineOverlay)添加覆蓋物到地圖上。
class MyBuslineOverlay extends BusLineOverlay {
public MyBuslineOverlay(BaiduMap arg0) {
super(arg0);
}
/**
* 站點點擊事件
*/
@Override
public boolean onBusStationClick(int arg0) {
MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0);
bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));
return true;
}
}
線路計劃
線路計劃分為3種:駕車、換成(公交)、步行。而線路計劃又與之前的各種檢索相似。
線路計劃先關類都在此包結構下。

我將這個包下面的類做了1下標注,這樣就很清楚了,3種線路計劃方式就相當于1個poi檢索,只有參數設置的時候需要注意下。
線路計劃里有策略這1概念。那駕車線路計劃說,就包括4種策略:躲避擁堵、最短距離、較少費用、時間優先,這4種策略組成了1個枚舉類型:DrivingRoutePlanOption.DrivingPolicy。

設置點的時候,傳入的參數是PlanNode類型的。該類有兩個靜態的方法,1個通過設置城市名和地名,1個通過設置經緯度,都可以返回1個PlanNode對象。
OK,到此為止,線路計劃已沒有任何難處了,下面只貼出駕車線路計劃的代碼,其余的可以下載demo查看。
DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();
drivingOption.policy(DrivingPolicy.values()[drivingSpinner
.getSelectedItemPosition()]);// 設置駕車線路策略
drivingOption.from(PlanNode.withCityNameAndPlaceName("北京", startPlace));// 設置出發點
drivingOption.to(PlanNode.withCityNameAndPlaceName("北京", endPlace));// 設置終點
routePlanSearch.drivingSearch(drivingOption);// 發起駕車線路計劃
/**
* 駕車線路結果回調 查詢的結果可能包括多條駕車線路方案
*/
@Override
public void onGetDrivingRouteResult(
DrivingRouteResult drivingRouteResult) {
bdMap.clear();
if (drivingRouteResult == null
|| drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(RoutePlanningActivity.this, "抱歉,未找到結果",
Toast.LENGTH_SHORT).show();
}
if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起終點或途經點地址有岐義,通過以下接口獲得建議查詢信息
// drivingRouteResult.getSuggestAddrInfo()
return;
}
if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(
bdMap);
drivingRouteOverlay.setData(drivingRouteResult.getRouteLines()
.get(drivintResultIndex));// 設置1條駕車線路方案
bdMap.setOnMarkerClickListener(drivingRouteOverlay);
drivingRouteOverlay.addToMap();
drivingRouteOverlay.zoomToSpan();
totalLine = drivingRouteResult.getRouteLines().size();
Toast.makeText(RoutePlanningActivity.this,
"共查詢出" + totalLine + "條符合條件的線路", 1000).show();
if (totalLine > 1) {
nextLineBtn.setEnabled(true);
}
// 通過getTaxiInfo()可以得到很多關于打車的信息
Toast.makeText(
RoutePlanningActivity.this,
"該線路打車總路程"
+ drivingRouteResult.getTaxiInfo()
.getDistance(), 1000).show();
}
}
};
下載
demo下載地址~~~
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈