示例中心
功能在线体验
控制台

高德 开发 Android 地图SDK 开发指南 获取地图数据 获取POI数据

更新时间:2017年05月15日

高德提供了千万级别的 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);//设置查询页码

点我下载POI分类码表

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中开源。

示例中心 功能
在线体验
常见问题