获取POI数据 最后更新时间: 2021年01月22日
高德提供了千万级别的 POI(Point of Interest,兴趣点)。在地图表达中,一个 POI 可代表一栋大厦、一家商铺、一处景点等等。通过POI搜索,完成找餐馆、找景点、找厕所等等的功能。地图 SDK 的搜索功能提供多种获取 POI 数据的接口,下文将逐一介绍。
注意:地图SDK V4.1.3版本开始,SDK不再提供 com.amap.api.maps.overlay 包下的overlay,已在官方demo中进行开源。
关键字检索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() 方法发送请求。
poiSearch.searchPOIAsyn();
5、通过回调接口 onPoiSearched 解析返回的结果,将查询到的 POI 以绘制点的方式显示在地图上。
6、说明:
1)可以在回调中解析result,获取POI信息。
2)result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类。
3)若当前城市查询不到所需POI信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市。
4)如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议。
5)返回结果成功或者失败的响应码。1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)
public void onPoiSearched(PoiResult result, int rCode) {
//解析result获取POI信息
}
周边检索POI
适用于搜索某个位置附近的POI,可设置POI的类别,具体查询所在位置的餐饮类、住宅类POI,例如:查找天安门附近的厕所等等场景。
与关键字检索的唯一区别需要通过 PoiSearch 的 setBound 方法设置圆形查询范围。
poiSearch.setBound(new SearchBound(new LatLonPoint(locationMarker.getPosition().latitude,
locationMarker.getPosition().longitude), 1000));//设置周边搜索的中心点以及半径
多边形内检索的POI
不同于周边搜索,周边搜索是一个圆形范围,而多边形搜索的范围是一个多边形,适用于在搜索某个不规则区域的POI查询,例如:查找中关村范围内的停车场。
List<LatLonPoint> points = new ArrayList<LatLonPoint>();
points.add(new LatLonPoint(39.941711, 116.382248));
points.add(new LatLonPoint(39.884882, 116.359566));
points.add(new LatLonPoint(39.878120, 116.437630));
points.add(new LatLonPoint(39.941711, 116.382248));
poiSearch.setBound(new SearchBound(points));//设置多边形区域
ID检索POI
通过关键字检索、周边检索以及多边形检索,或者任意形式得到的高德POI ID信息,可通过ID检索来获取POI完整详细信息。
实现步骤如下:
1、继承 OnPoiSearchListener 监听。
2、构造 PoiSearch 对象,并设置监听。对于ID检索,query参数设置成 null。
poiSearch = new PoiSearch(this, null);
poiSearch.setOnPoiSearchListener(this);
3、调用 PoiSearch 的 searchPOIIdAsyn(java.lang.String poiID) 方法发送请求。
poiSearch.searchPOIIdAsyn(ID);// 异步搜索
4、通过回调接口 onPoiItemSearched 解析返回的结果。由于是检索具体的某一个POI,直接回调该POI对象 PoiItem。
@Override
public void onPoiItemSearched(PoiItem item, int rCode) {
//获取PoiItem获取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() 方法发送请求。
inputTips.requestInputtipsAsyn();
5、通过回调接口 onGetInputtips 解析返回的结果,获取输入提示返回的信息。
6、说明:
1)在回调中解析 tipList,获取输入提示词的相关信息。
2)tipList 数组中的对象是 Tip ,Tip 类中包含 PoiID、Adcode、District、Name 等信息。
注意:
a 、由于提示中会出现相同的关键字,但是这些关键字所在区域不同,使用时可以通过 tipList.get(i).getDistrict() 获得区域,也可以在提示时在关键字后加上区域。
b、当 Tip 的 getPoiID() 返回空,并且 getPoint() 也返回空时,表示该提示词不是一个真实存在的 POI,这时区域、经纬度参数都是空的,此时可根据该提示词进行POI关键词搜索
c、当 Tip 的 getPoiID() 返回不为空,但 getPoint() 返回空时,表示该提示词是一个公交线路名称,此时用这个id进行公交线路查询。
d、当 Tip 的 getPoiID() 返回不为空,且 getPoint() 也不为空时,表示该提示词一个真实存在的POI,可直接显示在地图上。
3)返回结果成功或者失败的响应码。1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)
@Override
public void onGetInputtips(final List<Tip> tipList, int rCode) {
//通过tipList获取Tip信息
}
道路沿途检索POI
从搜索 SDK 3.5.0 版本开始支持,可查询路径沿途的加油站、ATM、汽修店、厕所。显示效果如图所示:
实现输入提示的步骤如下:
1、继承 OnRoutePOISearchListener 监听。
2、通过 RoutePOISearchQuery(LatLonPoint keyword, java.lang.String city) 设置搜索条件。
RoutePOISearchQuery query = new RoutePOISearchQuery(mStartPoint ,mEndPoint, mode, type, 250);
3、构造 RoutePOISearch 对象,并设置监听。
final RoutePOISearch search = new RoutePOISearch(this, query);
search.setPoiSearchListener(this);
4、调用 RoutePOISearch 的 searchRoutePOIAsyn() 方法发送请求。
search.searchRoutePOIAsyn();
5、通过回调接口 onRoutePoiSearched 解析返回的结果,获取输入提示返回的信息。
6、说明:
1)可以在回调中解析 result,获取 POI 信息。
2)result.getRoutePois() 可以获取到 RoutePOIItem 列表,Poi 详细信息可参考 RoutePOIItem 类。
3)返回结果成功或者失败的响应码。1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)
@Override
public void onRoutePoiSearched(RoutePOISearchResult result, int errorCode) {
//解析result获取POI信息
}
注意事项
1、请注意:使用上述功能需要下载地图SDK,导入搜索功能的jar包。
2、地图SDK V4.1.3版本开始,SDK不再提供 com.amap.api.maps.overlay 包下的overlay,已在官方demo中开源。