高德地圖——關鍵字檢索POI
如何你想整合高德地圖SDK:跳轉這兒
如何你想獲取定位資訊:跳轉這兒
下面我們介紹下:根據關鍵字檢索適用於在某個城市搜尋某個名稱相關的POI
即類似於 朋友圈獲取附近位置功能
先看下效果圖:
下面介紹怎麼實現此功能:
類需要繼承 OnPoiSearchListener 監聽
public class SearchActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener{}
開啟許可權 :
//設定定位許可權 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION); } else { //監聽EditText輸入 initListener(); }
構造 PoiSearch.Query 物件,通過 PoiSearch.Query(String query, String ctgr, String city) 設定搜尋條件,構造 PoiSearch 物件,並設定監聽,呼叫 PoiSearch 的 searchPOIAsyn() 方法傳送請求。
注意:
PoiSearch.Query(String query, String ctgr, String city)第一個引數表示搜尋字串,第二個引數表示poi搜尋型別,第三個引數表示poi搜尋區域(空字串代表全國)
1、關鍵字未設定城市資訊(預設為全國搜尋)時,如果涉及多個城市資料返回,僅會返回建議城市,請根據APP需求,選取城市進行搜尋。
2、不設定POI的類別,預設返回“餐飲服務”、“商務住宅”、“生活服務”這三種類別的POI,下方提供了POI分類碼錶,請按照列表內容設定希望檢索的POI型別。(建議使用POI型別的程式碼進行檢索)
/** * 開始進行poi搜尋 */ protected void doSearchQuery(String key) { currentPage = 0; //不輸入城市名稱有些地方搜尋不到 // 第一個引數表示搜尋字串,第二個引數表示poi搜尋型別,第三個引數表示poi搜尋區域(空字串代表全國) query = new PoiSearch.Query(key, "", ""); // 設定每頁最多返回多少條poiitem query.setPageSize(10); // 設定查詢頁碼 query.setPageNum(currentPage); //構造 PoiSearch 物件,並設定監聽 poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); //呼叫 PoiSearch 的 searchPOIAsyn() 方法傳送請求。 poiSearch.searchPOIAsyn(); }
通過回撥介面 onPoiSearched 解析返回的結果
/**
* POI資訊查詢回撥方法
*/
@Override
public void onPoiSearched(PoiResult result, int rCode) {
//rCode 為1000 時成功,其他為失敗
if (rCode == AMapException.CODE_AMAP_SUCCESS) {
// 解析result 獲取搜尋poi的結果
if (result != null && result.getQuery() != null) {
if (result.getQuery().equals(query)) { // 是否是同一條
poiResult = result;
ArrayList<LocationAddressInfo> data = new ArrayList<LocationAddressInfo>();//自己建立的資料集合
// 取得第一頁的poiitem資料,頁數從數字0開始
//poiResult.getPois()可以獲取到PoiItem列表
List<PoiItem> poiItems = poiResult.getPois();
//若當前城市查詢不到所需POI資訊,可以通過result.getSearchSuggestionCitys()獲取當前Poi搜尋的建議城市
List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();
//如果搜尋關鍵字明顯為誤輸入,則可通過result.getSearchSuggestionKeywords()方法得到搜尋關鍵詞建議。
List<String> suggestionKeywords = poiResult.getSearchSuggestionKeywords();
//解析獲取到的PoiItem列表
for(PoiItem item : poiItems){
//獲取經緯度物件
LatLonPoint llp = item.getLatLonPoint();
double lon = llp.getLongitude();
double lat = llp.getLatitude();
//返回POI的名稱
String title = item.getTitle();
//返回POI的地址
String text = item.getSnippet();
data.add(new LocationAddressInfo(String.valueOf(lon), String.valueOf(lat), title, text));
}
listAdapter = new LocationListAdapter(this, data);
listView.setAdapter(listAdapter);
}
} else {
Toast.makeText(SearchActivity.this,"無搜尋結果",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(SearchActivity.this,"錯誤碼"+rCode,Toast.LENGTH_SHORT).show();
}
}
下面附上 PoiItem類 方法: 跳轉這兒檢視詳細方法說明
限定符和型別 | 方法和說明 |
---|---|
boolean |
equals(java.lang.Object obj) 比較兩個POI 的id 是否相等。 |
java.lang.String |
getAdCode() 返回POI 的行政區劃程式碼。 |
java.lang.String |
getAdName() 返回POI 的行政區劃名稱。 |
java.lang.String |
getBusinessArea() 返回POI的所在商圈。 |
java.lang.String |
getCityCode() 返回POI的城市編碼 |
java.lang.String |
getCityName() 返回POI的城市名稱。 |
java.lang.String |
getDirection() 返回逆地理編碼查詢時POI座標點相對於地理座標點的方向。 |
int |
getDistance() 獲取 POI 距離中心點的距離。 |
java.lang.String |
getEmail() 返回POI的電子郵件地址。 |
LatLonPoint |
getEnter() 返回POI入口經緯度。 |
LatLonPoint |
getExit() 返回POI出口經緯度。 |
IndoorData |
getIndoorData() 返回POI的室內資訊,如樓層、建築物。 |
LatLonPoint |
getLatLonPoint() 返回POI的經緯度座標 |
java.lang.String |
getParkingType() 返回POI的停車場型別 |
java.util.List<Photo> |
getPhotos() 返回POI的圖片資訊。 |
PoiItemExtension |
getPoiExtension() 返回POI的擴充套件資訊。 |
java.lang.String |
getPoiId() 返回POI 的id,即其唯一標識。 |
java.lang.String |
getPostcode() 返回POI的郵編。 |
java.lang.String |
getProvinceCode() 返回 POI 的省/自治區/直轄市/特別行政區編碼。 |
java.lang.String |
getProvinceName() 返回POI的省/自治區/直轄市/特別行政區名稱 。 |
java.lang.String |
getSnippet() 返回POI的地址。 |
java.util.List<SubPoiItem> |
getSubPois() 子POI資訊獲取。 |
java.lang.String |
getTel() 返回POI的電話號碼。 |
java.lang.String |
getTitle() 返回POI的名稱。 |
java.lang.String |
getTypeCode() 返回興趣點型別編碼。 |
java.lang.String |
getTypeDes() 返回POI 的型別描述。 |
java.lang.String |
getWebsite() 返回POI的網址。 |
int |
hashCode() 繼承自Object,直接返回POI id 的hashcode。 |
boolean |
isIndoorMap() 返回是否支援室內地圖 。 |
java.lang.String |
toString() 繼承自Object,返回POI 的名稱(name)。 |
下面附上完整程式碼如下:
import android.Manifest;
import android.annotation.TargetApi;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.Toast;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import java.util.ArrayList;
import java.util.List;
public class SearchActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener{
private EditText mEt_keyword;
private RecyclerView listView;
private static final int REQUEST_PERMISSION_LOCATION = 0;
private String keyWord = "";// 要輸入的poi搜尋關鍵字
private PoiResult poiResult; // poi返回的結果
private int currentPage = 0;// 當前頁面,從0開始計數
private PoiSearch.Query query;// Poi查詢條件類
private PoiSearch poiSearch;// POI搜尋
private List<LocationAddressInfo> mData = new ArrayList<>();
private LocationListAdapter listAdapter;
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
mEt_keyword = (EditText) findViewById(R.id.et_keyword);
listView = (RecyclerView) findViewById(R.id.irc_listview);
listView.setLayoutManager(new LinearLayoutManager(this));
//設定定位許可權
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);
} else {
//監聽EditText輸入
initListener();
}
}
private void initListener() {
mEt_keyword.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
keyWord = String.valueOf(charSequence);
if ("".equals(keyWord)) {
Toast.makeText(SearchActivity.this,"請輸入搜尋關鍵字",Toast.LENGTH_SHORT).show();
return;
} else {
doSearchQuery(keyWord);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
/**
* 開始進行poi搜尋
*/
protected void doSearchQuery(String key) {
currentPage = 0;
//不輸入城市名稱有些地方搜尋不到
// 第一個引數表示搜尋字串,第二個引數表示poi搜尋型別,第三個引數表示poi搜尋區域(空字串代表全國)
query = new PoiSearch.Query(key, "", "");
// 設定每頁最多返回多少條poiitem
query.setPageSize(10);
// 設定查詢頁碼
query.setPageNum(currentPage);
//構造 PoiSearch 物件,並設定監聽
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
//呼叫 PoiSearch 的 searchPOIAsyn() 方法傳送請求。
poiSearch.searchPOIAsyn();
}
/**
* POI資訊查詢回撥方法
*/
@Override
public void onPoiSearched(PoiResult result, int rCode) {
//rCode 為1000 時成功,其他為失敗
if (rCode == AMapException.CODE_AMAP_SUCCESS) {
// 解析result 獲取搜尋poi的結果
if (result != null && result.getQuery() != null) {
if (result.getQuery().equals(query)) { // 是否是同一條
poiResult = result;
ArrayList<LocationAddressInfo> data = new ArrayList<LocationAddressInfo>();//自己建立的資料集合
// 取得第一頁的poiitem資料,頁數從數字0開始
//poiResult.getPois()可以獲取到PoiItem列表
List<PoiItem> poiItems = poiResult.getPois();
//若當前城市查詢不到所需POI資訊,可以通過result.getSearchSuggestionCitys()獲取當前Poi搜尋的建議城市
List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();
//如果搜尋關鍵字明顯為誤輸入,則可通過result.getSearchSuggestionKeywords()方法得到搜尋關鍵詞建議。
List<String> suggestionKeywords = poiResult.getSearchSuggestionKeywords();
//解析獲取到的PoiItem列表
for(PoiItem item : poiItems){
//獲取經緯度物件
LatLonPoint llp = item.getLatLonPoint();
double lon = llp.getLongitude();
double lat = llp.getLatitude();
//返回POI的名稱
String title = item.getTitle();
//返回POI的地址
String text = item.getSnippet();
data.add(new LocationAddressInfo(String.valueOf(lon), String.valueOf(lat), title, text));
}
listAdapter = new LocationListAdapter(this, data);
listView.setAdapter(listAdapter);
}
} else {
Toast.makeText(SearchActivity.this,"無搜尋結果",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(SearchActivity.this,"錯誤碼"+rCode,Toast.LENGTH_SHORT).show();
}
}
/**
* POI資訊查詢回撥方法
*/
@Override
public void onPoiItemSearched(PoiItem item, int rCode) {
}
}
詳細 獲取POI資料 sdk介紹請看 高德開發指南:https://lbs.amap.com/api/android-sdk/guide/map-data/poi/?sug_index=2
demo下載連結:https://download.csdn.net/download/shanshan_1117/10679670
demo效果圖: