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

来源:互联网 发布:淘宝客 click url 编辑:程序博客网 时间:2024/05/12 06:24

检索功能实现

说到这里小白的我不得不说 百度地图真是个坑货! SDK更新杠杠的,但是API跟没动过一样。各种无奈!

好啦不多说了,小灰灰上图...



首先在 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;        }    }

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



2 0
原创粉丝点击