高德地图-搜索服务-POI搜索
之前公司项目收货地址仿饿了么的收货地址,结果发现自己实现的关键字搜索和周边搜索,搜索到的poi列表跟饿了么的并不完全一样,后来考虑了下,应该是搜索的范围、类型之类的设置的不一样。后来搜索了下,也的确是这样,,现在记录下来,留给自己也留给大家。
高德地图 Android SDK 提供了千万级别的POI(Point Of Interesting,兴趣点)的搜索。
目前支持关键字搜索、周边搜索、指定区域搜索的同步、异步方法。搜索返回 POI 的基本信息,如POI ID,POI 名称、类型、经纬度、地址等。
关键字搜索
通过 PoiSearch.Query(String query, String ctgr, String city) 设置搜索条件。参数“query”为搜索的关键字,“ctgr”为搜索类型(类型参照表从相关下载处获取)、“city”为搜索城市,是必填参数,关键字和类型至少输入一个。
设置搜索条件,发送请求
query = new PoiSearch.Query(keyWord, "", cityCode); // keyWord表示搜索字符串, //第二个参数表示POI搜索类型,二者选填其一, //POI搜索类型共分为以下20种:汽车服务|汽车销售| //汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务| //住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务| //金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施 //cityCode表示POI搜索区域的编码,是必须设置参数 query.setPageSize(10);// 设置每页最多返回多少条poiitem query.setPageNum(currentPage);//设置查询页码 PoiSearch poiSearch = new PoiSearch(this, query);//初始化poiSearch对象 poiSearch.setOnPoiSearchListener(this);//设置回调数据的监听器 poiSearch.searchPOIAsyn();//开始搜索
通过回调接口接受并解析返回的结果。
public void onPoiSearched(PoiResult result, int rCode) { //可以在回调中解析result,获取POI信息 //result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类 //若当前城市查询不到所需Poi信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市 //如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议 //返回结果成功或者失败的响应码。0为成功,其他为失败(详细信息参见网站开发指南-错误码对照表) }
显示效果如图所示:
周边搜索
使用 PoiSearch.searchPOIAsyn() 搜索 POI。使用 PoiSearch.setOnPoiSearchListener() 方法设置监听器,在 PoiSearch.OnPoiSearchListener 接口回调方法 onPoiSearched(PoiResult poiResult,int rCode)中处理返回结果。当指定搜索城市时,若没有返回 POI 结果,则会返回包含关键字的建议城市名称。当关键字搜索无结果时,则会返回搜索建议关键字。
设置搜索条件,发送请求
query = new PoiSearch.Query(keyWord, "汽车维修|餐饮服务", cityCode); // keyWord表示搜索字符串,第二个参数表示POI搜索类型,默认为:生活服务、餐饮服务、商务住宅 //共分为以下20种:汽车服务|汽车销售| //汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务| //住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务| //金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施 //cityCode表示POI搜索区域,(这里可以传空字符串,空字符串代表全国在全国范围内进行搜索) query.setPageSize(10);// 设置每页最多返回多少条poiitem query.setPageNum(currentPage);//设置查第一页 PoiSearch poiSearch = new PoiSearch(this,query); poiSearch.setBound(new SearchBound(new LatLonPoint(locationMarker.getPosition().latitude, locationMarker.getPosition().longitude), 1000));//设置周边搜索的中心点以及区域 poiSearch.setOnPoiSearchListener(this);//设置数据返回的监听器 poiSearch.searchPoiAsyn();//开始搜索
通过回调接口获取数据
public void onPoiSearched(PoiResult result, int rCode) { //在回调函数中解析result获取POI信息 //result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类 //若当前城市查询不到所需Poi信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市 //如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议 //返回结果成功或者失败的响应码。0为成功,其他为失败(详细信息参见网站开发指南-错误码对照表) }
显示效果如图所示:
区域搜索
在周边搜索的基础上,增加了矩形限定区域。根据搜索矩形区域左下角和右上角的顶点坐标,使用 PoiSearch.SearchBound(LatLonPoint lowerLeft, LatLonPoint upperRight) 设置搜索范围。
输入提示搜索
在输入关键字(至少两个字符)时,可以使用Inputtips类的 Inputtips.InputtipsListener 接口监听输入信息,并使用 requestInputtips(String keyword, String city) 发送提示请求。
注:提示中会出现相同的关键字,但是这些关键字所在区域不同,使用时可以通过 tipList.get(i).getDistrict() 获得区域,也可以在提示时在关键字后加上区域。
例如用户输入“高德”,输入框下方的列表会显示包含关键字字段的输入提示信息。
显示效果如图所示:
示例代码如下:
// 发送输入提示请求 // newText表示提示关键字,第二个参数默认代表全国,也可以为城市区号 inputTips.requestInputtips(newText, "");
通过回调接口获取数据
public void onGetInputtips(List<Tip> inputTips, int rcode){ //在回调函数中解析inputTips,获取输入提示返回的信息 //Tip类中包含Poi的Adcode、District、Name信息 //返回结果成功或者失败的响应码。0为成功,其他为失败(详细信息参见网站开发指南-错误码对照表) }
行政区划搜索
根据县(区)级行政区划名称查询其下级区划的详细信息,如:中心点坐标、编码等等。
DistrictSearch search = new DistrictSearch(mContext); DistrictSearchQuery query = new DistrictSearchQuery(); query.setKeywords("keywords");//传入关键字 query.setKeywordsLevel(DistrictSearchQuery.KEYWORDS_CITY); query.setShowBoundary(true);//是否返回边界值 search.setQuery(query); search.setOnDistrictSearchListener(this);//绑定监听器 search.searchDistrictAnsy();//开始搜索
通过回调接口获取数据
public void onDistrictSearched(DistrictResult districtResult) { //在回调函数中解析districtResult获取行政区划信息 //在districtResult.getAMapException().getErrorCode()=0时调用districtResult.getDistrict()方法 //获取查询行政区的结果,详细信息可以参考DistrictItem类。 }
显示效果如图所示: