百度地图集成(三):检索功能的实现

百度地图集成概要

百度地图集成(一):百度地图简单实现

百度地图集成(二):百度定位以及反编译地理位置

百度地图集成(三):检索功能的实现

百度地图集成(四):零散


第三篇 检索功能实现

废话不多说了直接干...



首先在 initMap() 方法里创建POI 检索实例

 //创建POI检索实例
 mPoiSearch = PoiSearch.newInstance();

点击搜索时 进入 getPoiSearch() 方法,开始我们的poi检索之旅

首先检索之前就要关闭我们的软键盘

 // 关闭软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
     imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

之后呢

      final OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
            public void onGetPoiResult(PoiResult result) {

                L.e("poi查询结果回调:" + result.toString());
                if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                    if (baiduMap != null) {
                        baiduMap.clear();
                    }
                    MyOverlayManager myOverlayManager = new MyOverlayManager(baiduMap);
                    myOverlayManager.setData(result, makerIcon);
                    myOverlayManager.addToMap();
                    myOverlayManager.zoomToSpan();
                    baiduMap.setOnMarkerClickListener(myOverlayManager);
                } else {
                    getLatLng();
                }
            }

            public void onGetPoiDetailResult(PoiDetailResult result) {
                // poi详情查询结果回调
                L.e("poi详情查询结果回调:" + result.toString());
            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
                // poi室内检索结果回调
                L.e("poi室内检索结果回调:" + poiIndoorResult.toString());
            }
        };
        mPoiSearch.setOnGetPoiSearchResultListener(poiListener); // 设置检索监听回调
        mPoiSearch.searchInCity(new PoiCitySearchOption()
                .city(mBdLocationListener.sCityStr)         // 城市
                .keyword(mFindContent.getText().toString()) // 检索的关键字 
                .pageNum(0)        // 分页编号 这里只要第一页前五条
                .pageCapacity(5)); // 设置每页几条 默认10条
     }

写到这里你会注意到上面有一个自己键的类MyOverlayManager 这个是管理Marker的 

主要用途就是让我们的这里查找出来的每页的 Maker 适应到页面上的视野区。

下面就是那个类

    // 覆盖物
    public class MyOverlayManager extends OverlayManager {

        private PoiResult mPoiResult;
        private int[] mImg;

        public MyOverlayManager(BaiduMap baiduMap) {
            super(baiduMap);
        }

        public void setData(PoiResult poiResult, int[] img) {
            mPoiResult = poiResult;
            mImg = img;
        }

        @Override
        public List<OverlayOptions> getOverlayOptions() {
            ArrayList<OverlayOptions> arrayList = null;
            if (mPoiResult != null || mPoiResult.getAllPoi() != null) {
                arrayList = new ArrayList<>();
                for (int i = 0; i < mPoiResult.getAllPoi().size(); i++) {
                    if (mPoiResult.getAllPoi().get(i).location == null)
                        continue;
                    
                    // 给marker加上标签
                    Bundle bundle = new Bundle();
                    bundle.putInt("index", i);
                    arrayList.add(new MarkerOptions()
                            .icon(BitmapDescriptorFactory.fromResource(mImg[i]))
                            .position(mPoiResult.getAllPoi().get(i).location));
                }
            }
            return arrayList;
        }

        @Override
        public boolean onMarkerClick(Marker marker) {
            if (marker.getExtraInfo() != null) {
                int index = marker.getExtraInfo().getInt("index");
                PoiInfo poi = mPoiResult.getAllPoi().get(index);
                return true;
            }
            return false;
        }

        @Override
        public boolean onPolylineClick(Polyline polyline) {
            return false;
        }
    }

如果你是写的 你会发现百度包中根本没有 OverlayManager 啊,

如果你直接复制 你也会发现导包的时候是让你新建有木有......

我也找了半天,终于在我以前的百度代码中找到了这类的代码,不得不鄙视下度娘!

下面是代码的下载地址:算是帮助类吧

http://download.csdn.net/detail/qq_35352552/9800453

下载完成之后解压出来直接复制到 java 包下

然后导包即可;

下面是检索的所有代码

    private int makerIcon[] = new int[]{R.drawable.maker_1, R.drawable.maker_2, R.drawable.maker_3, R.drawable.maker_4, R.drawable.maker_5};

    // 检索功能
    public void getPoiSearch() {
        // 关闭软键盘
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
        }

        final OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
            public void onGetPoiResult(PoiResult result) {

                L.e("poi查询结果回调:" + result.toString());
                if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                    if (baiduMap != null) {
                        baiduMap.clear();
                    }
                    MyOverlayManager myOverlayManager = new MyOverlayManager(baiduMap);
                    myOverlayManager.setData(result, makerIcon);    // 设置数据
                    myOverlayManager.addToMap();    // 将所有Overlay 添加到地图上
                    myOverlayManager.zoomToSpan();  // 所有Overlay都在合适的视野内
                    baiduMap.setOnMarkerClickListener(myOverlayManager);
                } else {
                    getLatLng();
                }
            }

            public void onGetPoiDetailResult(PoiDetailResult result) {
                // poi详情查询结果回调
                L.e("poi详情查询结果回调:" + result.toString());
            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
                // poi室内检索结果回调
                L.e("poi室内检索结果回调:" + poiIndoorResult.toString());
            }
        };
        mPoiSearch.setOnGetPoiSearchResultListener(poiListener);// 设置检索监听回调
        mPoiSearch.searchInCity(new PoiCitySearchOption()
                .city(mBdLocationListener.sCityStr)         // 城市
                .keyword(mFindContent.getText().toString()) // 检索的关键字
                .pageNum(0)         // 分页编号 这里只要第一页前五条
                .pageCapacity(5));  // 设置每页几条 默认10条
    }

    // 覆盖物
    public class MyOverlayManager extends OverlayManager {

        private PoiResult mPoiResult;
        private int[] mImg;

        public MyOverlayManager(BaiduMap baiduMap) {
            super(baiduMap);
        }

        public void setData(PoiResult poiResult, int[] img) {
            mPoiResult = poiResult;
            mImg = img;
        }

        @Override
        public List<OverlayOptions> getOverlayOptions() {
            ArrayList<OverlayOptions> arrayList = null;
            if (mPoiResult != null || mPoiResult.getAllPoi() != null) {
                arrayList = new ArrayList<>();
                for (int i = 0; i < mPoiResult.getAllPoi().size(); i++) {
                    if (mPoiResult.getAllPoi().get(i).location == null)
                        continue;

                    // 给marker加上标签
                    Bundle bundle = new Bundle();
                    bundle.putInt("index", i);
                    arrayList.add(new MarkerOptions()
                            .icon(BitmapDescriptorFactory.fromResource(mImg[i]))
                            .position(mPoiResult.getAllPoi().get(i).location));

                    // 这里可以吧信息放入一个list集合在listView 中显示并操作
                }
            }
            return arrayList;
        }

        @Override
        public boolean onMarkerClick(Marker marker) {
            // 点击Marker 的操作
            if (marker.getExtraInfo() != null) {
                int index = marker.getExtraInfo().getInt("index");
                PoiInfo poi = mPoiResult.getAllPoi().get(index);

//              String name = poi.name;   // poi名称 *
//              String city = poi.city;   // 城市
//              String address = poi.address;     // 地址信息
//              LatLng location = poi.location;   // 坐标 *

                return true;
            }
            return false;
        }

        @Override
        public boolean onPolylineClick(Polyline polyline) {
            return false;
        }
    }

其他的操作,根据需求而定了...



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值