POI(Point of Interest),即“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个景点、一个邮筒或者一个公交站等。
百度地图SDK提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形区域检索)。下面分别对三种POI检索服务的使用方法作说明。
关键字检索适用于在某个城市内搜索某个名称相关的POI,例如:查找“北京市”的“小吃”。
示例如下:
mPoiSearch = PoiSearch.newInstance();
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult poiResult) {}@Overridepublic void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {}@Overridepublic void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {}//废弃@Overridepublic void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {}};
mPoiSearch.setOnGetPoiSearchResultListener(listener);
/*** PoiCiySearchOption 设置检索属性* city 检索城市* keyword 检索内容关键字* pageNum 分页页码*/mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京") //必填.keyword("美食") //必填.pageNum(0));
mPoiSearch.destroy();
除了示例代码中描述的必填的字段,其他常用字段的介绍如下表所示。
pageNum | 分页编号,默认返回第0页结果 |
---|---|
pageCapacity | 设置每页容量,默认为10条结果 |
tag | 设置检索分类,如“美食” |
scope | 值为1 或 空,返回基本信息 |
值为2,返回POI详细信息 | |
cityLimit | 是否限制检索区域为城市内 |
poiFilter | 设置检索过滤条件,scope为2时有效 |
isExtendAdcode | 是否召回行政区划编码,默认为true |
注:您可以在Web服务API页面查看PoiSearch请求参数和返回参数的详细内容。
1. POI检索时,city是必填项。
2. 开发者可以通过设置PoiCitySearchOption对象cityLimit字段为false(默认为true)来扩大检索范围,当city内检索无结果时,会将检索范围扩大至全国。
效果如图:
开发者可以针对PoiCitySearch检索到的结果进行进一步的检索以获取详细信息。
示例如下:
发起检索:
//PoiInfo 检索到的第一条信息PoiInfo poi = mPoiResult.getAllPoi().get(0);//通过第一条检索信息对应的uid发起详细信息检索mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUids(poi.uid)); // uid的集合,最多可以传入10个uid,多个uid之间用英文逗号分隔。
在onGetPoiDetailResult(PoiDetailSearchResult PoiDetailSearchResult)回调方法中处理。
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {......@Overridepublic void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {}};
注意:自V5.2.0起,Poi详情检索的回调方法onGetPoiDetailResult(PoiDetailResult poiDetailResult)方法已废弃,请使用onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult)方法代替,在检索时检索参数必须使用poiUids(poi.uid)。
周边检索是在一个圆形范围内的POI检索,适用于以某个位置为中心点,自定义搜索半径,搜索某个位置附近的POI。
设置SearchOption,发起周边检索请求示例如下:
/*** 以天安门为中心,搜索半径100米以内的餐厅*/mPoiSearch.searchNearby(new PoiNearbySearchOption().location(new LatLng(39.915446, 116.403869)).radius(100);//支持多个关键字并集检索,不同关键字间以$符号分隔,最多支持10个关键字检索。如:”银行$酒店”.keyword("餐厅").pageNum(0));
效果如图:
POI区域检索,即“在由开发者指定的西南角和东北角组成的矩形区域内的POI检索”。
设置PoiBoundsSearchOptions,发起检索请求示例如下:
/*** 设置矩形检索区域*/LatLngBounds searchBounds = new LatLngBounds.Builder().include(new LatLng( 39.92235, 116.380338 )).include(new LatLng( 39.947246, 116.414977)).build();/*** 在searchBounds区域内检索餐厅*/mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(searchBounds).keyword("餐厅"));
效果如图:
开发者可以使用自V3.6.0起开源的覆盖物源代码来完成Poi检索结果的展示。
示例如下:
@Overridepublic void onGetPoiResult(PoiResult poiResult) {if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {mBaiduMap.clear();//创建PoiOverlay对象PoiOverlay poiOverlay = new PoiOverlay(mBaiduMap);//设置Poi检索数据poiOverlay.setData(poiResult);//将poiOverlay添加至地图并缩放至合适级别poiOverlay.addToMap();poiOverlay.zoomToSpan();}}
效果如图:
注意:Android 7.5.2 起新增adCode字段,IsExtendAdcode字段设为true后,可以在返回结果中通过adCode字段查询行政区划编码。
上一篇
下一篇
本篇文章对您是否有帮助?