百度地图开发(四)之POI检索

转载请注明出处:

POI检索

POI~~~ Point of Interest,翻译过来就是“兴趣点”。我们在使用地图的时候,搜索周边的ktv,饭店,或者宾馆的时候,输入关键字,然后地图展示给我们很多个点,这些点就是我需要的信息。这就是所谓的兴趣点,也就是一个普通的查询,然后结果的反馈罢了。

百度地图SDK提供了三种类型的POI检索:周边检索、区域检索和城市内检索。

还是从API看起。找到com.baidu.mapapi.search.poi程序包:

看到这个包中有一个回调接口,用于接收检索结果;PoiSearch类用于检索请求;PoiResult类表示搜索结果,相比它应该在OnGetPoiSearchResultListener这个接口的某个函数中最为参数~~

最后还有4个xxxOption参数类,分别对应周边检索、城市内检索、区域检索、poi详情检索。

PoiSearch :POI检索接口,是我们应该重点关注的类。

从api中可以看出,此类是一个静态类,构造方法被私有化处理,只能通过newInstance()获得实例。看到它的方法,就发现正好有4个方法对应上面四个检索参数类。

详情检索searchPoiDetail()PoiDetailSearchOption

实际上,详情检索与其他三种类型不算一类,它是在通过其他三种检索类型得到的结果在去查询得到详细的信息。

通过这几个类可以对不同的类型设置检索参数,下面看一下监听接口:

该接口有两个回调函数,一个用于接收返回的poi查询结果,一个用于接收返回的详情查询结果。而结果分别封装在PoiResult和PoiDetailResult这两个类中了。

PoiResult:

从这里可以看出,百度对检索结果进行了分页处理。所以在设置参数的时候,需要设置单页容量和页号。

// 实例化PoiSearch对象poiSearch = PoiSearch.newInstance();// 设置检索监听器poiSearch.setOnGetPoiSearchResultListener(poiSearchListener);/** * POI检索监听器 */OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult poiResult) {if (poiResult == null|| poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果Toast.makeText(PoiSearchActivity.this, "未找到结果",Toast.LENGTH_LONG).show();return;}if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回bdMap.clear();MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap);poiOverlay.setData(poiResult);// 设置POI数据bdMap.setOnMarkerClickListener(poiOverlay);poiOverlay.addToMap();// 将所有的overlay添加到地图上poiOverlay.zoomToSpan();//totalPage = poiResult.getTotalPageNum();// 获取总分页数Toast.makeText(PoiSearchActivity.this,"总共查到" + poiResult.getTotalPoiNum() + "个兴趣点, 分为"+ totalPage + "页", Toast.LENGTH_SHORT).show();}}/** * 城市内搜索 */private void citySearch(int page) {// 设置检索参数PoiCitySearchOption citySearchOption = new PoiCitySearchOption();citySearchOption.city(editCityEt.getText().toString());// 城市citySearchOption.keyword(editSearchKeyEt.getText().toString());// 关键字citySearchOption.pageCapacity(15);// 默认每页10条citySearchOption.pageNum(page);// 分页编号// 发起检索请求poiSearch.searchInCity(citySearchOption);}/** * 范围检索 */private void boundSearch(int page) {PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();LatLng southwest = new LatLng(latitude – 0.01, longitude – 0.012);// 西南LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北LatLngBounds bounds = new LatLngBounds.Builder().include(southwest).include(northeast).build();// 得到一个地理范围对象boundSearchOption.bound(bounds);// 设置poi检索范围boundSearchOption.keyword(editSearchKeyEt.getText().toString());// 检索关键字boundSearchOption.pageNum(page);poiSearch.searchInBound(boundSearchOption);// 发起poi范围检索请求}/** * 附近检索 */private void nearbySearch(int page) {PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();nearbySearchOption.location(new LatLng(latitude, longitude));nearbySearchOption.keyword(editSearchKeyEt.getText().toString());nearbySearchOption.radius(1000);// 检索半径,单位是米nearbySearchOption.pageNum(page);poiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求} 通过以上代码,就可以完成三种类型的检索,分组的时候只不过是改一下pageNum()参数。

查询出这一组组的结果之后,可以通过添加覆盖物的方式显示在地图上。但是如果按照之前的添加覆盖物的方式进行添加的话,需要在得到的List<PoiInfo>中得到经纬度数据,然后循环构造出覆盖物对象,添加到地图上。

这样做未尝不可,但是百度提供了更简便的方式给我们。

打开com.baidu.mapapi.overlayutil这个包,看到有一个类用于显示poi的overlay。

我们一直在旅行,一直在等待某个人可以成为我们旅途的伴侣,

百度地图开发(四)之POI检索

相关文章:

你感兴趣的文章:

标签云: