上一篇簡單介紹了與地圖的互動功能,可以實現在地圖上標記點,繪製線,新增資訊框等功能。對於一些不常使用的功能點,可通過檢視官方文件進行了解,這裡不做過於詳細的說明。
檢索地圖資料
今天這篇推文主要說說其餘幾個比較常用的功能,比如POI檢索(查詢目標物,美食,風景等)、地點輸入提示檢索(關鍵字搜尋提示)、公交資訊查詢。官網羅列的其餘功能目前不是很常見,這裡不做說明,需要的話可以閱讀官方文件。
POI檢索
POI即興趣點。在地理資訊系統中,可以理解為一棟房子,一個景點,一個公交站等。那麼我們的POI檢索說白了就是檢索目標物,比如搜尋我的房子,周邊的餐館,景點等。
百度地圖SDK提供三種型別的POI檢索:城市內檢索,周邊檢索和區域檢索。這裡簡單說下關鍵字檢索。
比如在天津市查詢小吃
//POI搜尋
mPoiSearch=PoiSearch.newInstance();
mPoiSearch.setOnGetPoiSearchResultListener(listener);
//進行POI檢索
mPoiSearch.searchInCity(new PoiCitySearchOption()
.city("天津市")
.keyword("美食")
.pageNum(0));
/**
* POI監聽器
* */
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
/**
* 返回監聽得到的檢索值
* 並將其標記出來
* */
@Override
public void onGetPoiResult(PoiResult poiResult) {
List<PoiInfo> list=poiResult.getAllPoi();
if (list!=null){
for (int i=0;i<list.size();i++){
PoiInfo info=list.get(i);
LatLng point=new LatLng(info.getLocation().latitude,info.getLocation().longitude);
//構建Marker圖示
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.location);
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
mBaiduMap.addOverlay(option);
}
}
}
@Override
public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
//廢棄
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
};
上面通過簡單的程式碼邏輯,就能拿到天津市的美食地點。這裡我將獲取到的美食地點在地圖上面標記出來,其實百度SDK在得到美食地點時可以設定的引數特別多,我們可以根據自己的業務邏輯來進行相對應的展示。
地點輸入提示檢索
地點檢索輸入提示服務也被叫做POI熱詞建議檢索,線上建議檢索簡稱Sug檢索,是指根據關鍵詞查詢線上建議詞。就是查詢時百度SDK根據你輸入的關鍵字進行推薦提示,可以幫助你快速尋找到你的目的地。下面我們可以簡單看下,如何去實現這個功能。
//Sug檢索
mSuggestionSearch=SuggestionSearch.newInstance();
mSuggestionSearch.setOnGetSuggestionResultListener(suggesttionlistener);
//Sug檢索 天津的好利來 只搜尋好
mSuggestionSearch.requestSuggestion(new SuggestionSearchOption().city("天津市").keyword("好"));
/**
* Sug監聽器
* */
OnGetSuggestionResultListener suggesttionlistener = new OnGetSuggestionResultListener() {
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
//處理sug檢索結果
List<SuggestionResult.SuggestionInfo> info=suggestionResult.getAllSuggestions();
if (null!=info){
for (int i=0;i<info.size();i++){
Log.d("Tag",""+info.get(i).getKey());
}
}
}
};
這裡我沒有在介面上做下拉介面卡顯示,就直接通過獲取天津市 好 把獲取到的資訊列印到Log中。我們可以看到百度SDK推薦了一些關於好的店鋪。
在實際的專案中,我們可以根據使用者輸入的內容,及時在下拉的是列表中將獲取到的提示目標地址顯示出來,可以推薦給使用者,方便其快速定位到他想去的位置。
公交資訊查詢
這塊在實際的業務需求中還是很常見的,開發者可以通過POI檢索獲取公交型別的POI資訊,根據POI對應的UID請求BusLineSearch檢索詳細的公交路線資訊等。
目前根據官方給的教程操作,沒有明確說呼叫開源的BusLineOverlay程式碼,只能通過官方給的DEMO來找,主要找這個路線下的這兩個檔案即可。
BaiduMap_AndroidSDK_v7.3.0_Simple\BaiduMapsApiASDemo\app\src\main\java\com\baidu\mapapi\overlayutil
OverlayManager.java和BusLineOverlay.java,新增到自己的專案中就可以使用。
獲取公交的路線,需要兩個步驟。
第一、先POI檢索獲取公交路線UID。
//公交路線檢索
mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword("963").scope(2));
mBusLineSearch=BusLineSearch.newInstance();
overlay= new BusLineOverlay(mBaiduMap);
/**
* 返回監聽得到的檢索值
* 並將其標記出來
* */
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult==null||poiResult.error!= SearchResult.ERRORNO.NO_ERROR)
return;
for (PoiInfo poi:poiResult.getAllPoi()){
if (poi.type == PoiInfo.POITYPE.BUS_LINE ||poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
//獲取該條公交路線POI的UID
busLineId = poi.uid;
break;
}
}
}
第二、根據UID的值來獲取SDK中的公交路線資訊,使用BusLineOverlay將其顯示在地圖上。
//北京市公交查詢
mBusLineSearch.searchBusLine(new BusLineSearchOption()
.city("北京")
.uid(busLineId));
/**
* 繪製公交路線的監聽器
* */
OnGetBusLineSearchResultListener buslineListener=new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
if (busLineResult == null || busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
overlay.setData(busLineResult);
overlay.addToMap();
overlay.zoomToSpan();
}
};
這樣就簡單實現了公交資訊的展示,我們可以根據自己的業務進行擴充套件,很方便。這裡官方教程沒有很明確的指示出程式碼,此時你就需要去參考DEMO來實現,有時候還需要在百度找找看,是不是別人也遇到過同樣的問題,是否寫了部落格,你也可以參考參考進行學習。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。