有时候我们需要在地图上搜索周边信息,我们可以用百度地图提供的POI检索。
POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。百度地图SDK提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形范围检索)。
PoiSearch mPoiSearch;
mPoiSearch = PoiSearch.newInstance();
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){
public void onGetPoiResult(PoiResult result){
//获取POI检索结果
}
public void onGetPoiDetailResult(PoiDetailResult result){
//获取Place详情页检索结果
}
};
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
城市检索
根据关键字检索适用于在某个城市搜索某个名称相关的POI,例如:杭州的沙县小吃。
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(“杭州”)
.keyword(“沙县小吃”)
.pageNum(10));
POI区域检索以“用户指定的左下角和右上角坐标的长方形区域”为检索范围的poi检索。
LatLng southwest = new LatLng( 39.92235, 116.380338 );
LatLng northeast = new LatLng( 39.947246, 116.414977);
LatLngBounds searchbound = new LatLngBounds.Builder()
.include(southwest).include(northeast)
.build();
mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(searchbound)
.keyword("餐厅"));
周边检索
周边搜索是一个圆形范围,适用于以某个位置为中心点,自定义检索半径值,搜索某个位置附近的POI。
mPoiSearch.searchNearby(new PoiNearbySearchOption()
.keyword("餐厅")
.sortType(PoiSortType.distance_from_near_to_far)
.location(center)
.radius(radius)
.pageNum(10));
mPoiSearch.destroy();
构造自定义 PoiOverlay 类;
private class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPoiClick(int index) {
super.onPoiClick(index);
return true;
}
}
在POI检索回调接口中添加自定义的PoiOverlay;
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
return;
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
mBaiduMap.clear();
//创建PoiOverlay
PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
//设置overlay可以处理标注点击事件
mBaiduMap.setOnMarkerClickListener(overlay);
//设置PoiOverlay数据
overlay.setData(result);
//添加PoiOverlay到地图中
overlay.addToMap();
overlay.zoomToSpan();
return;
}
}
注意如果找不到PoiOerlay类,请看这篇https://blog.csdn.net/flyrunlx/article/details/51428399
public class MainActivity extends AppCompatActivity {
//百度地图控件
private MapView mapView;
//百度地图对象
private BaiduMap baiduMap;
private PoiSearch mPoiSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//该方法注意要在setContentView之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
/**
* 地图初始化
*/
//获取百度地图控件
mapView = (MapView) findViewById(R.id.baiduMapView);
//获取百度地图对象
baiduMap = mapView.getMap();
mPoiSearch = PoiSearch.newInstance();
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city("杭州")
.keyword("沙县小吃")
.pageNum(10));
}
private class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPoiClick(int index) {
super.onPoiClick(index);
return true;
}
}
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult result) {
//获取POI检索结果
if (result == null
|| result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
Toast.makeText(MainActivity.this, "未找到结果",
Toast.LENGTH_LONG).show();
return;
} else if (result.error == SearchResult.ERRORNO.NO_ERROR) {
if (result != null) {
baiduMap.clear();
//创建PoiOverlay
PoiOverlay overlay = new MyPoiOverlay(baiduMap);
//设置overlay可以处理标注点击事件
baiduMap.setOnMarkerClickListener(overlay);
//设置PoiOverlay数据
overlay.setData(result);
//添加PoiOverlay到地图中
overlay.addToMap();
overlay.zoomToSpan();
return;
}
mPoiSearch.destroy();
}
}
public void onGetPoiDetailResult(PoiDetailResult result) {
//获取Place详情页检索结果
result.getAddress();
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
};
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
mapView.onDestroy();
mapView = null;
super.onDestroy();
}
}
第一次进入的时候,返回的错误码是:SearchResult.ERRORNO.PERMISSION_UNFINISHED。
注意:在SDK各功能组件使用之前都需要调用
SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中
主要是网络验证走子线程,在显示界面时,不一定完成授权。在项目中一般放在Application的初始化方法中,练习的话,关闭demo再进一次就好了。
最后效果如图: