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


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

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM