poi(point of interest),即“兴趣点”。在地理信息系统中,一个poi可以是一栋房子、一个景点、一个邮筒或者一个公交站等。
百度地图sdk提供三种类型的poi检索:城市内检索、周边检索和区域检索(即矩形区域检索)。下面分别对三种poi检索服务的使用方法作说明。
关键字检索适用于在某个城市内搜索某个名称相关的poi,例如:查找“北京市”的“小吃”。
示例如下:
mpoisearch = poisearch.newinstance();
ongetpoisearchresultlistener listener = new ongetpoisearchresultlistener() { @override public void ongetpoiresult(poiresult poiresult) { } @override public void ongetpoidetailresult(poidetailsearchresult poidetailsearchresult) { } @override public void ongetpoiindoorresult(poiindoorresult poiindoorresult) { } //废弃 @override public void ongetpoidetailresult(poidetailresult poidetailresult) { } };
mpoisearch.setongetpoisearchresultlistener(listener);
/** * poiciysearchoption 设置检索属性 * city 检索城市 * keyword 检索内容关键字 * pagenum 分页页码 */ mpoisearch.searchincity(new poicitysearchoption() .city("北京") //必填 .keyword("美食") //必填 .pagenum(0));
mpoisearch.destroy();
poicitysearchoption属性详解
除了示例代码中描述的必填的字段,其他常用字段的介绍如下表所示。
pagenum | 分页编号,默认返回第0页结果 |
pagecapacity | 设置每页容量,默认为10条结果 |
tag | 设置检索分类,如“美食” |
scope | 值为1 或 空,返回基本信息 |
值为2,返回poi详细信息 | |
citylimit | 是否限制检索区域为城市内 |
poifilter | 设置检索过滤条件,scope为2时有效 |
isextendadcode | 是否召回行政区划编码,默认为true |
注:您可以在 web服务api 页面查看poisearch请求参数和返回参数的详细内容。
1. poi检索时,city是必填项。
2. 当输入的关键字在该city检索无结果,而在其他城市检索到时,sdk会返回一个cityinfo对象列表,该列表可以通过poiresult类getsuggestcitylist方法获取。
public listgetsuggestcitylist()
cityinfo包含城市名和该城市内检索结果的数量等信息。开发者可以通过该列表进行二次请求。
3. 开发者可以通过设置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() { ...... @override public 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检索结果的展示。
示例如下:
@override public 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字段查询行政区划编码。