承接上文所写内容https://blog.csdn.net/qq_41562408/article/details/82819896,我们已经实现了百度地图的地图显示、通过经纬度定位、实时定位、地图覆盖物等功能。读者可以依据笔者之前文章进行查看,本次我们对百度地图中POI检索进行了解,POI的官方解释为:
POI检索简介
POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
百度地图SDK提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形范围检索)。
所以本文就POI检索进行范围内搜索、城市内搜索、周边搜索进行案例解释。ps:在此说明一下,百度地图官方文档注
注自V3.6.0起,原内置覆盖物相关类的代码开源
覆盖物开源代码中提供了一些基于基础覆盖而组合而成的高级覆盖物,包括用于显示poi数据,规划路线,公交详情路线的覆盖物。
OverlayManager/ PoiOverlay/ IndoorPoiOverlay/ IndoorRouteOverlay/ TransitRouteOverlay/ WalkingRouteOverlay/ BikingRouteOverlay/ DrivingRouteOverlay/ BusLineOverlay/ MassTransitRouteOverlay/ 以上源码可在BaiduMapsApiDemo工程中找到。
所以本文中的操作需要用的空间需要在第一篇中下载的BaiduMapsApiDemo中找到其目录为BaiduLBS_AndroidSDK_Sample\BaiduMap_AndroidSDK_v5.1.0_Sample\BaiduMap_AndroidSDK_v5.1.0_Sample\BaiduMapsApiASDemo\app\src\main\java\com\baidu\mapapi\overlayutil将整个overlayutil文件夹复制到Androidstudio中java文件所在位置。
值得注意的是这样运行还是会出错,找到出错地方,将显示图标语句改为资源图标便可例如:
//.fromAssetWithDpi("Icon_line_node.png")));
.fromResource(R.drawable.icon_geo)));
便可,这也是我的一个疑问点,不知道该如何解决。只能退而求其次这样了。
1、范围内搜索:
核心代码:
PoiBoundSearchOption params=new PoiBoundSearchOption();
LatLngBounds bounds=new LatLngBounds.Builder().include(new LatLng(40.048459,116.302072))
.include(new LatLng(40.050675,116.304317)).build();
params.bound(bounds);//指定搜索范围
params.keyword("加油站");//指定搜索内容
return params;
(1)implements OnGetPoiSearchResultListener添加继承
(2)添加变量
protected PoiSearch poiSearch;
protected PoiOverlay poiOverlay;
(3)oncreat方法添加
poiSearch=PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(this);
poiOverlay=new PoiOverlay(baiduMap){
@Override
public boolean onPoiClick(int i) {
return PoiSearchBaseActivity.this.onPoiClick(i);
}
};
baiduMap.setOnMarkerClickListener(poiOverlay);
poiSearchInit();
之后添加代码:
public boolean onPoiClick(int i) { PoiInfo poiInfo=poiOverlay.getPoiResult().getAllPoi().get(i); Toast.makeText(csdn.this,poiInfo.name+","+poiInfo.address,Toast.LENGTH_SHORT).show(); return true; } @Override public void onGetPoiResult(PoiResult result) { if (result==null || result.error!= SearchResult.ERRORNO.NO_ERROR){ Toast.makeText(getApplicationContext(),"没有搜索到",Toast.LENGTH_SHORT).show(); return; } poiOverlay.setData(result); poiOverlay.addToMap();//把所有的数据变成覆盖物添加到百度map上面 poiOverlay.zoomToSpan();//把所有的搜索结果 } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } private PoiBoundSearchOption getSearchParams() { PoiBoundSearchOption params=new PoiBoundSearchOption(); LatLngBounds bounds=new LatLngBounds.Builder().include(new LatLng(40.048459,116.302072)) .include(new LatLng(40.050675,116.304317)).build(); params.bound(bounds);//指定搜索范围 params.keyword("加油站");//指定搜索内容 return params; } public void poiSearchInit() { poiSearch.searchInBound(getSearchParams()); }
运行得到结果如图所示:
至此范围内搜索就完工了,在这里想吐槽一下,本来这篇文章昨天中午就写完了的,但是一直运行不出效果,真的难受检查了好久,我把我们队的大佬都惊动了,依然没得办法,重开了个项目,依然没有办法。。。代码没问题,就是运行不出来,所以不敢发,怕有什么问题,文章的质量还是要有保障的,文采不咋地,但是一定要真实不是。没办法,昨晚只能放着干其他事情了。因为今天是中秋节,所以一上午休息,看电视。(#^.^#)惬意一下。下午重新运行,代码还没考虑怎么修改,结果成功了。。 就很奇怪,有时候不知道怎么错的,有时候不知道怎么对的。。。这程序员过的真的迷糊,还是好好提示自己能力吧,不管怎么说,中秋佳节,祝各位看客阖家幸福,欢乐。我也恢复一下,其他poi检索功能,后面文章在续。