Android集成百度地图(三)POI检索

      有时候我们需要在地图上搜索周边信息,我们可以用百度地图提供的POI检索。

      POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。百度地图SDK提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形范围检索)。

POI检索

1.创建POI检索实例

 PoiSearch mPoiSearch;
 mPoiSearch = PoiSearch.newInstance();

2.创建POI检索监听者

OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){  

    public void onGetPoiResult(PoiResult result){  
    //获取POI检索结果  
    }  

    public void onGetPoiDetailResult(PoiDetailResult result){  
    //获取Place详情页检索结果  
    }  
};

3.设置POI检索监听者

mPoiSearch.setOnGetPoiSearchResultListener(poiListener);

4.发起检索请求

城市检索

根据关键字检索适用于在某个城市搜索某个名称相关的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));

5.释放POI检索实例

 mPoiSearch.destroy();

6.显示检索结果覆盖物

构造自定义 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再进一次就好了。


最后效果如图:



猜你喜欢

转载自blog.csdn.net/hua93/article/details/79684086