Android學習筆記之使用百度地圖實現Poi搜索

PS:裝個系統裝了一天.心力憔悴.感受不會再愛了.git

 

學習內容:api

1.使用百度Map實現Poi搜索.ide

2.短串分享函數

3.在線建議查詢學習

 

  百度地圖的研究也算是過半了.可以實現定位,實現相關信息的搜索,實現地圖控制這也就算是掌握了一大部分了.此次主要是說說如何去實現poi搜索.那麼什麼是Poi.優化

  Poi:poi中文翻譯爲興趣點.撈乾的說其實就是周邊的一些ktv,酒店,餐館,理髮店等等都是一個poi.在實現了基礎定位的前提後,去搜索附近的poi.這樣就能夠完成一些其餘事情.好比說訂一份外賣,預約一個房間等等.這些都是基於poi搜索纔可以實現的.ui

  百度SDK提供了三種Poi搜索:周邊搜索,區域搜索,城市內搜索(com.baidu.mapapi.search.poi).
this

  搜索是基於上面的api,實現Poi搜索仍是須要分幾個過程的.首先是須要實例化對象PoiSearch.url

private PoiSearch poiSearch= PoiSearch.newInstance();

   而後須要爲PoiSearch設置上搜索的方式.方式就是上面所說的三種.三種搜索方式都在下面進行了列舉,咱們能夠看到百度地圖對檢索的結果進行了分頁處理,所以在顯示的時候咱們須要制定分頁的頁數以及每頁的數量.spa

   /**
     * 城市內搜索,直接根據輸入框的內容去實現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

相關文章
相關標籤/搜索