標籤:
PS:裝個系統裝了一天.心裡憔悴.感覺不會再愛了.
學習內容:
1.使用百度Map實現Poi搜尋.
2.短串分享
3.線上建議查詢
百度地圖的研究也算是過半了.能夠實現定位,實現相關資訊的搜尋,實現地圖控制這也就算是掌握了一大部分了.這次主要是說說如何去實現poi搜尋.那麼什麼是Poi.
Poi:poi中文翻譯為興趣點.撈乾的說其實就是周邊的一些ktv,酒店,餐館,理髮店等等都是一個poi.在實現了基礎定位的前提後,去搜尋附近的poi.這樣就可以完成一些其他事情.比如說訂一份外賣,預定一個房間等等.這些都是基於poi搜尋才能夠實現的.
百度SDK提供了三種Poi搜尋:周邊搜尋,地區搜尋,城市內搜尋(com.baidu.mapapi.search.poi).
搜尋是基於上面的api,實現Poi搜尋還是需要分幾個過程的.首先是需要執行個體化對象PoiSearch.
private PoiSearch poiSearch= PoiSearch.newInstance();
然後需要為PoiSearch設定上搜尋的方式.方式就是上面所說的三種.三種搜尋方式都在下面進行了列舉,我們可以看到百度地圖對檢索的結果進行了分頁處理,因此在顯示的時候我們需要制定分頁的頁數以及每頁的數量.
/** * 城市內搜尋,直接根據輸入框的內容去實現Poi搜尋. */ private void citySearch(int page) { // 設定檢索參數 PoiCitySearchOption citySearchOption = new PoiCitySearchOption(); citySearchOption.city(editCityEt.getText().toString());// 城市 citySearchOption.keyword(editSearchKeyEt.getText().toString());// 關鍵字 citySearchOption.pageCapacity(15);// 預設每頁10條 citySearchOption.pageNum(page);// 分頁編號 // 為PoiSearch設定搜尋方式. poiSearch.searchInCity(citySearchOption); } /** * 範圍檢索,範圍搜尋需要制定座標.以矩形的方式進行範圍搜尋. */ private void boundSearch(int page) { PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption(); LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南 LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 東北 LatLngBounds bounds = new LatLngBounds.Builder().include(southwest) .include(northeast).build();// 得到一個地理範圍對象 boundSearchOption.bound(bounds);// 設定poi檢索範圍 boundSearchOption.keyword(editSearchKeyEt.getText().toString());// 檢索關鍵字 boundSearchOption.pageNum(page); poiSearch.searchInBound(boundSearchOption);// 發起poi範圍檢索請求 } /** * 附近檢索,範圍搜尋需要指定圓心.以圓形的方式進行搜尋. */ private void nearbySearch(int page) { PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); nearbySearchOption.location(new LatLng(latitude, longitude)); nearbySearchOption.keyword(editSearchKeyEt.getText().toString()); nearbySearchOption.radius(1000);// 檢索半徑,單位是米 nearbySearchOption.pageNum(page); poiSearch.searchNearby(nearbySearchOption);// 發起附近檢索請求 }
通過上面的方式我們就可以為PoiSearch制定搜尋的方式.指定了搜尋模式之後我們就需要指定檢索後的相關監聽.監聽的設定通過api內部的OnGetPoiSearchResultListener這個回調介面去完成.這個介面接受PoiResult作為參數,當完成搜尋後,回調當前這個介面,就可以去擷取我們的搜尋結果了以下就是實現Poi尋找的結果監聽.
OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() { // 擷取poiResult @Override public void onGetPoiResult(PoiResult poiResult) { if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) { bdMap.clear(); MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap); //執行個體化poiOverlay對象. poiOverlay.setData(poiResult); //設定poiOverlay資料. bdMap.setOnMarkerClickListener(poiOverlay);//當標誌物被點擊時監聽設定. poiOverlay.addToMap();//將所有的poi添加到Map上. poiOverlay.zoomToSpan(); totalPage = poiResult.getTotalPageNum(); Toast.makeText( PoiSearchActivity.this, "總共查到" + poiResult.getTotalPoiNum() + "個興趣點,分為" + totalPage + "頁", Toast.LENGTH_SHORT).show(); } } // 當點擊覆蓋物的時候,查詢詳細的資料資訊,作為回調返回資料資訊 @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } };
這裡我們可以看到.這個回調介面內部封裝了兩個方法.一個是對poi結果的查詢,一個是對poi詳細結果的查詢.poi詳細結果包含當前這個興趣點的大部分資訊(比如poi的名稱,地理位置,座標資料等等).這個是詳細結果查詢結果的擷取.詳細結果的查詢是基於PoiResult的.因此才會封裝兩個函數.
poi詳細結果查詢則需要傳遞PoiDetailResult對象,作為介面回到的參數.這個對象通過下面的方式進行執行個體化,這裡是指定了在點擊的poi的時候去觸發poi詳細查詢事件.這樣就可以完成在poi查詢的基礎上實現poi更多資訊的查詢.
class MyPoiOverlay extends PoiOverlay { public MyPoiOverlay(BaiduMap arg0) { super(arg0); } // 檢索Poi詳細資料.擷取PoiOverlay @Override public boolean onPoiClick(int arg0) { super.onPoiClick(arg0); PoiInfo poiInfo = getPoiResult().getAllPoi().get(arg0); poiSearch.searchPoiDetail(new PoiDetailSearchOption() .poiUid(poiInfo.uid)); return true; } }
這裡通過使用PoiOverlay類內部提供的函數,可以講我們擷取的所有的Overlay直接添加到地圖上.這樣非常的方便.我們就不用將一組組的查詢資料儲存在List<T>列表中,然後通過遍曆的方式將資料放置在Map上了.只需要通過使用PoiOverlay中的addToMap()函數直接就可以完成這個操作.如果我們想移除這些Overlay只需要調用removeFromMap()就可以全部移除.這樣就使得搜尋結果的顯示變得更加的方便.
最後再說一些相關的小細節問題.就是關於Poi的問題.拿我們最熟悉的美團外賣來說吧.它能夠定位到很多的poi,不僅僅是獨立的店鋪還是在商廈內部的店鋪都能夠精準的定位到.獨立在外部的店鋪很容易就搜尋到.而商廈內部的店鋪想要被定位到則需要店鋪去百度地圖中的百度地圖商戶中心去申請,填寫店鋪資訊,申請成功之後這些店鋪就自然而然的可以被搜尋到了.如果沒有去申請,那麼在商廈內部的一些店鋪是無法定位的.關於poi就說這麼多吧.
2.短串共用
短串共用:表示定位到的地理位置以url的形式進行展示.這個url被百度最佳化成了一個短的url串,就被成為短串.這個短串我們可以通過簡訊,郵箱等方式去分享.
短串共用的實現還是非常的簡單的.
首先需要執行個體化短串共用對象.
private ShareUrlSearch shareUrlSearch = ShareUrlSearch.newInstance();
然後設定短串檢索監聽.
/** * 短串檢索監聽器 */ OnGetShareUrlResultListener shareUrlResultListener = new OnGetShareUrlResultListener() { //poi詳情分享url @Override public void onGetPoiDetailShareUrlResult(ShareUrlResult arg0) { Toast.makeText(PoiSearchActivity.this, "詳細url分享:"+arg0.toString(), Toast.LENGTH_SHORT).show(); } //請求位置資訊分享url @Override public void onGetLocationShareUrlResult(ShareUrlResult arg0) { Toast.makeText(PoiSearchActivity.this, "url分享:"+arg0.toString(), Toast.LENGTH_SHORT).show(); } };
設定了檢索監聽之後需要發送請求,才能夠實現短串的資料資訊分享.
shareUrlSearch.requestLocationShareUrl(new LocationShareURLOption().location(poiInfo.location).name("共用點名稱").snippet("123"));shareUrlSearch.requestPoiDetailShareUrl(new PoiDetailShareURLOption().poiUid(poiInfo.uid));
3.線上建議查詢.
看了某博主的部落格,說線上建議查詢和短串分享大同小異,代碼就直接略了.於是乎自己又上網一頓搜.確實倒是那麼回事.大同小異,不過還是簡單的說一下首先需要執行個體化對象.
suggestionSearch = SuggestionSearch.newInstance();suggestionSearch.requestSuggestion(new SuggestionSearchOption().keyword("百度").city("背景")); 發送請求
然後設定相關監聽就可以了.
/** * 線上建議 * */ OnGetSuggestionResultListener suggestionResultListener = new OnGetSuggestionResultListener() { @Override public void onGetSuggestionResult(SuggestionResult arg0) { // TODO Auto-generated method stub Toast.makeText(PoiSearchActivity.this, arg0.toString(), Toast.LENGTH_SHORT).show(); } };
我認為還是poi搜尋是關鍵.poi檢索更多的時候才是我們想要實現的功能.這裡的相關監聽我都設定的非常的簡單,直接使用Toast框去列印.如果有更高的需求我們可以去進行自訂..
最後放一個原始碼:http://files.cnblogs.com/files/RGogoing/BDMap.rar
Android學習筆記之使用百度地圖實現Poi搜尋