如何你想集成高德地图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效果图: