1. 程式人生 > >[013] 百度地圖API之城市POI搜尋-獲取所有結果(Android)

[013] 百度地圖API之城市POI搜尋-獲取所有結果(Android)

      本文主要講解如何通過百度地圖API搜尋得到一個城市裡的所有POI這裡有必要對“所有”這個詞進行強調一下,以便引起重視,之所以這樣說,是因為在搜尋POI時,預設僅返回一頁的搜尋結果10條,那麼如何才能得到所有的搜尋結果呢?其實baidu map api是提供了相關的方法,但我發現有相當多的網友都在問這個問題,所以有必要講解演示一下。
      先講一下什麼稱之為“城市POI搜尋”?它與我們在上一篇文章([011] 百度地圖API之POI搜尋-發現你身邊的興趣點,如超市、餐廳、ATM...(Android))中瞭解到的POI搜尋有什麼區別呢?
      上一篇文章中所呼叫的是地圖API的“周邊POI搜尋”服務,即檢索周圍多少米以內的POI;而本章所要呼叫的是地圖API的“城市POI搜尋”服務,即檢索某個城市中所有的POI。如果你看完這兩篇文章後,你會發現僅僅是呼叫的方法不同而以,搜尋結果的處理方法是同一個方法,搜尋結果的處理程式碼也是完全一樣的。


      下面將給出城市POI搜尋的一個完整示例,並且會講解如何才能獲取到所有的搜尋結果。
1)佈局檔案res/layout/poi_city_search.xml
     

2)繼承了com.baidu.mapapi.MapActivity的Activity類
     

3)AndroidManifest.xml中的配置
     
4)執行結果
       
程式執行起來後,我們輸入關鍵詞“ktv”進行搜尋,而在程式碼中我們設定了搜尋城市為“貴陽”,即我們要搜尋貴陽市所有的KTV。搜尋完成後,首先會彈出一個對話方塊,如上圖所示,顯示了搜尋到了POI總數及每一個POI名稱,點選“關閉”按鈕後,可以看到搜尋到的ktv所在位置也在地圖上進行了標註。
      到目前為止,一切看起來很正常。然而,真的是這樣嗎?請仔細看上面第一張圖中顯示的搜尋結果數為60,即在貴陽市總共個60家ktv,但是下面卻只顯示了10家ktv名稱,並且第二張圖中地圖中也只標註了10家ktv,這到底是為什麼呢?其它50家ktv結果去哪了?原因是這樣的:
      一次搜尋所得到的POI數有時候可能有成千上萬個,比如你搜索“餐廳”試試,試想如果一次性從百度地圖伺服器上返回上萬條搜尋結果資料到客戶的手機上將會是一種什麼樣的情況?所以百度地圖API對一次性返回的搜尋結果進行了限制--一次性最多隻能返回50條搜尋結果,預設情況下一次性返回10條搜尋結果。我們可以通過下面的方法去改變一次性返回的搜尋結果數:
            // 設定每頁返回的POI數,預設為10,取值範圍1-50
            MKSearch.setPoiPageCapacity(10);
但最大也只能設定為50。那麼怎麼才能一次性得到所有的搜尋結果呢?怎麼才能得到上面示例中的60家ktv的資訊呢?讓我們來改一下上面Activity中處理搜尋結果的方法onGetPoiResult,其實所有程式碼都保持不變。將onGetPoiResult方法內的處理程式碼修改為:
       
再來看一下執行結果:
     
怎麼樣?搜尋到的60家ktv資訊一次性全部顯示出來了吧。關鍵在於下面這3行程式碼:
            if(result.getPageIndex() < result.getNumPages()-1) {
                  mMKSearch.goToPoiPage(result.getPageIndex() + 1);
            }

伺服器是以分頁的形式分多次向我們返回搜尋結果的,result.getPageIndex()得到的是當前頁碼(從0開始)。這3行程式碼的含義是:如果當前頁不是最後一頁,那麼就轉到下一頁(goToPoiPage方法是作用是跳轉到搜尋結果的第幾頁),每次呼叫goToPoiPage方法,都會再次觸發搜尋請求,也就會再次回撥執行onGetPoiResult方法;這和網頁中的伺服器端分頁是一個道理,即每次點選“上一頁”、“下一頁”都會再一次提交查詢請求。這也就是為什麼我們要採用static型別的StringBuilder物件來儲存搜尋結果而不是在onGetPoiResult方法中定義一個區域性變數,並且還要在每次點選“搜尋”按鈕後,重新建立一個新的StringBuilder物件來儲存搜尋結果。
      完!