高德地圖-搜尋服務-POI搜尋
之前公司項目收貨位址仿餓了麼的收貨位址,結果發現自己實作的關鍵字搜尋和周邊搜尋,搜尋到的poi清單跟餓了麼的并不完全一樣,後來考慮了下,應該是搜尋的範圍、類型之類的設定的不一樣。後來搜尋了下,也的确是這樣,,現在記錄下來,留給自己也留給大家。
關鍵字搜尋
周邊搜尋
區域搜尋
高德地圖 Android SDK 提供了千萬級别的POI(Point Of Interesting,興趣點)的搜尋。
目前支援關鍵字搜尋、周邊搜尋、指定區域搜尋的同步、異步方法。搜尋傳回 POI 的基本資訊,如POI ID,POI 名稱、類型、經緯度、位址等。
關鍵字搜尋
通過 PoiSearch.Query(String query, String ctgr, String city) 設定搜尋條件。參數“query”為搜尋的關鍵字,“ctgr”為搜尋類型(類型參照表從相關下載下傳處擷取)、“city”為搜尋城市,是必填參數,關鍵字和類型至少輸入一個。
設定搜尋條件,發送請求
query = new PoiSearch.Query(keyWord, "", cityCode);
// keyWord表示搜尋字元串,
//第二個參數表示POI搜尋類型,二者選填其一,
//POI搜尋類型共分為以下20種:汽車服務|汽車銷售|
//汽車維修|機車服務|餐飲服務|購物服務|生活服務|體育休閑服務|醫療保健服務|
//住宿服務|風景名勝|商務住宅|政府機構及社會團體|科教文化服務|交通設施服務|
//金融保險服務|公司企業|道路附屬設施|地名位址資訊|公共設施
//cityCode表示POI搜尋區域的編碼,是必須設定參數
query.setPageSize(10);// 設定每頁最多傳回多少條poiitem
query.setPageNum(currentPage);//設定查詢頁碼
PoiSearch poiSearch = new PoiSearch(this, query);//初始化poiSearch對象
poiSearch.setOnPoiSearchListener(this);//設定回調資料的監聽器
poiSearch.searchPOIAsyn();//開始搜尋
通過回調接口接受并解析傳回的結果。
public void onPoiSearched(PoiResult result, int rCode) {
//可以在回調中解析result,擷取POI資訊
//result.getPois()可以擷取到PoiItem清單,Poi詳細資訊可參考PoiItem類
//若目前城市查詢不到所需Poi資訊,可以通過result.getSearchSuggestionCitys()擷取目前Poi搜尋的建議城市
//如果搜尋關鍵字明顯為誤輸入,則可通過result.getSearchSuggestionKeywords()方法得到搜尋關鍵詞建議
//傳回結果成功或者失敗的響應碼。0為成功,其他為失敗(詳細資訊參見網站開發指南-錯誤碼對照表)
}
顯示效果如圖所示:

周邊搜尋
使用 PoiSearch.searchPOIAsyn() 搜尋 POI。使用 PoiSearch.setOnPoiSearchListener() 方法設定監聽器,在 PoiSearch.OnPoiSearchListener 接口回調方法 onPoiSearched(PoiResult poiResult,int rCode)中處理傳回結果。當指定搜尋城市時,若沒有傳回 POI 結果,則會傳回包含關鍵字的建議城市名稱。當關鍵字搜尋無結果時,則會傳回搜尋建議關鍵字。
設定搜尋條件,發送請求
query = new PoiSearch.Query(keyWord, "汽車維修|餐飲服務", cityCode);
// keyWord表示搜尋字元串,第二個參數表示POI搜尋類型,預設為:生活服務、餐飲服務、商務住宅
//共分為以下20種:汽車服務|汽車銷售|
//汽車維修|機車服務|餐飲服務|購物服務|生活服務|體育休閑服務|醫療保健服務|
//住宿服務|風景名勝|商務住宅|政府機構及社會團體|科教文化服務|交通設施服務|
//金融保險服務|公司企業|道路附屬設施|地名位址資訊|公共設施
//cityCode表示POI搜尋區域,(這裡可以傳空字元串,空字元串代表全國在全國範圍内進行搜尋)
query.setPageSize(10);// 設定每頁最多傳回多少條poiitem
query.setPageNum(currentPage);//設定查第一頁
PoiSearch poiSearch = new PoiSearch(this,query);
poiSearch.setBound(new SearchBound(new LatLonPoint(locationMarker.getPosition().latitude,
locationMarker.getPosition().longitude), 1000));//設定周邊搜尋的中心點以及區域
poiSearch.setOnPoiSearchListener(this);//設定資料傳回的監聽器
poiSearch.searchPoiAsyn();//開始搜尋
通過回調接口擷取資料
public void onPoiSearched(PoiResult result, int rCode) {
//在回調函數中解析result擷取POI資訊
//result.getPois()可以擷取到PoiItem清單,Poi詳細資訊可參考PoiItem類
//若目前城市查詢不到所需Poi資訊,可以通過result.getSearchSuggestionCitys()擷取目前Poi搜尋的建議城市
//如果搜尋關鍵字明顯為誤輸入,則可通過result.getSearchSuggestionKeywords()方法得到搜尋關鍵詞建議
//傳回結果成功或者失敗的響應碼。0為成功,其他為失敗(詳細資訊參見網站開發指南-錯誤碼對照表)
}
顯示效果如圖所示:
區域搜尋
在周邊搜尋的基礎上,增加了矩形限定區域。根據搜尋矩形區域左下角和右上角的頂點坐标,使用 PoiSearch.SearchBound(LatLonPoint lowerLeft, LatLonPoint upperRight) 設定搜尋範圍。
輸入提示搜尋
在輸入關鍵字(至少兩個字元)時,可以使用Inputtips類的 Inputtips.InputtipsListener 接口監聽輸入資訊,并使用 requestInputtips(String keyword, String city) 發送提示請求。
注:提示中會出現相同的關鍵字,但是這些關鍵字所在區域不同,使用時可以通過 tipList.get(i).getDistrict() 獲得區域,也可以在提示時在關鍵字後加上區域。
例如使用者輸入“高德”,輸入框下方的清單會顯示包含關鍵字字段的輸入提示資訊。
顯示效果如圖所示:
示例代碼如下:
// 發送輸入提示請求
// newText表示提示關鍵字,第二個參數預設代表全國,也可以為城市區号
inputTips.requestInputtips(newText, "");
通過回調接口擷取資料
public void onGetInputtips(List<Tip> inputTips, int rcode){
//在回調函數中解析inputTips,擷取輸入提示傳回的資訊
//Tip類中包含Poi的Adcode、District、Name資訊
//傳回結果成功或者失敗的響應碼。0為成功,其他為失敗(詳細資訊參見網站開發指南-錯誤碼對照表)
}
行政區劃搜尋
根據縣(區)級行政區劃名稱查詢其下級區劃的詳細資訊,如:中心點坐标、編碼等等。
DistrictSearch search = new DistrictSearch(mContext);
DistrictSearchQuery query = new DistrictSearchQuery();
query.setKeywords("keywords");//傳入關鍵字
query.setKeywordsLevel(DistrictSearchQuery.KEYWORDS_CITY);
query.setShowBoundary(true);//是否傳回邊界值
search.setQuery(query);
search.setOnDistrictSearchListener(this);//綁定監聽器
search.searchDistrictAnsy();//開始搜尋
通過回調接口擷取資料
public void onDistrictSearched(DistrictResult districtResult) {
//在回調函數中解析districtResult擷取行政區劃資訊
//在districtResult.getAMapException().getErrorCode()=0時調用districtResult.getDistrict()方法
//擷取查詢行政區的結果,詳細資訊可以參考DistrictItem類。
}
顯示效果如圖所示: