搜索POI-Android 最后更新时间: 2021年01月22日
概述
通过兴趣点搜索, 实现乘客选择目的地, 进而实现车辆估价&路径导航等功能, 是乘客端功能中必要的能力.
高德提供了千万级别的 POI(Point of Interest,兴趣点).在地图表达中,一个 POI 可代表一栋大厦、一家商铺、一处景点等等。通过POI搜索,完成找餐馆、找景点、找厕所等等的功能.地图 SDK 的搜索功能提供多种获取 POI 数据的接口
关键词检索POI
根据关键字检索适用于在某个城市搜索某个名称相关的POI,例如:查找北京市的“肯德基”.
注意:
1、关键字未设置城市信息(默认为全国搜索)时,如果涉及多个城市数据返回,仅会返回建议城市,请根据APP需求,选取城市进行搜索.
2、不设置POI的类别,默认返回“餐饮服务”、“商务住宅”、“生活服务”这三种类别的POI,下方提供了POI分类码表,请按照列表内容设置希望检索的POI类型.(建议使用POI类型的代码进行检索)
实现关键字检索的步骤如下:
- 1.继承 OnPoiSearchListener 监听.
- 2.构造 PoiSearch.Query 对象,通过 PoiSearch.Query(String query, String ctgr, String city) 设置搜索条件.
query = new PoiSearch.Query(keyWord, "", cityCode);
//keyWord表示搜索字符串,
//第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)
//cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);//设置查询页码
- 3.构造 PoiSearch 对象,并设置监听.
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
- 4.调用 PoiSearch 的 searchPOIAsyn() 方法发送请求.
Java
poiSearch.searchPOIAsyn();
- 5、通过回调接口 onPoiSearched 解析返回的结果,将查询到的 POI 以绘制点的方式显示在地图上.
- 6、说明:
- 可以在回调中解析result,获取POI信息.
- result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类.
- 若当前城市查询不到所需POI信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市.
- 如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议.
- 返回结果成功或者失败的响应码.1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)
public void onPoiSearched(PoiResult result, int rCode) {
//解析result获取POI信息
}
注意:
- 关键词搜索中, 会返回子POI信息(childrenPOI), 如果此类POI需要在搜索框展示出来 , 例如: 搜索首都机场, 搜索中展示首都机场-T3航站楼
- 搜索中返回POIID, 可用作导航中导航目的地, 进而解决因POI过大造成绕路的问题
输入内容自动提示
输入提示是指根据用户输入的关键词,给出相应的提示信息,将最有可能的搜索词呈现给用户,以减少用户输入信息,提升用户体验。如:输入“方恒”,提示“方恒国际中心A座”,“方恒购物中心”等.
例如用户输入“高德”,输入框下方的列表会显示包含关键字字段的输入提示信息。显示效果如图所示:
实现输入提示的步骤如下:
1、继承 InputtipsListener 监听.
2、构造 InputtipsQuery 对象,通过 InputtipsQuery(java.lang.String keyword, java.lang.String city) 设置搜索条件.
//第二个参数传入null或者“”代表在全国进行检索,否则按照传入的city进行检索
InputtipsQuery inputquery = new InputtipsQuery(newText, city);
inputquery.setCityLimit(true);//限制在当前城市
3、构造 Inputtips 对象,并设置监听.
Inputtips inputTips = new Inputtips(InputtipsActivity.this, inputquery);
inputTips.setInputtipsListener(this);
4、调用 PoiSearch 的 requestInputtipsAsyn() 方法发送请求.
Java
inputTips.requestInputtipsAsyn();
5、通过回调接口 onGetInputtips 解析返回的结果,获取输入提示返回的信息.
6、说明:
- 在回调中解析 tipList,获取输入提示词的相关信息.
- tipList 数组中的对象是 Tip ,Tip 类中包含 PoiID、Adcode、District、Name 等信息.
注意:
- 由于提示中会出现相同的关键字,但是这些关键字所在区域不同,使用时可以通过 tipList.get(i).getDistrict() 获得区域,也可以在提示时在关键字后加上区域.
- 当 Tip 的 getPoiID() 返回空,并且 getPoint() 也返回空时,表示该提示词不是一个真实存在的 POI,这时区域、经纬度参数都是空的,此时可根据该提示词进行POI关键词搜索
- 当 Tip 的 getPoiID() 返回不为空,但 getPoint() 返回空时,表示该提示词是一个公交线路名称,此时用这个id进行公交线路查询。
- 当 Tip 的 getPoiID() 返回不为空,且 getPoint() 也不为空时,表示该提示词一个真实存在的POI,可直接显示在地图上。
@Override
public void onGetInputtips(final List<Tip> tipList, int rCode) {
//通过tipList获取Tip信息
}
注意事项
- 更多功能请查看地图SDK-POI检索相关文档: Android地图 / iOS地图
- 请注意:使用上述功能需要下载地图SDK,导入搜索功能的jar包.
- 地图SDK V4.1.3版本开始,SDK不再提供 com.amap.api.maps.overlay 包下的overlay,已在官方demo中开源.