在地图开发中,可能有这么一个需求:打开地图之后,立即显示当前位置附近的住宅区,效果如下

android开发 高德地图监听用户滑动 高德地图有监听功能吗_ide

具体实现思路:

添加一个定位监听器

//设置定位监听
            mlocationClient.setLocationListener(new AMapLocationListener() {
                @Override
                public void onLocationChanged(AMapLocation amapLocation) {
                    if (mListener != null && amapLocation != null) {
                        if (amapLocation != null
                                && amapLocation.getErrorCode() == 0) {
                            mListener.onLocationChanged(amapLocation);

                            double currentLat = amapLocation.getLatitude();//获取纬度
                            double currentLng  = amapLocation.getLongitude();//获取经度
                            currentCityName = amapLocation.getCity();//城市信息
      
                            processSearch(currentLat,currentLng,currentCityName);
                        } else {
                            String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
                        }
                    }
                }
            });

当你定位成功之后,可以获得当前城市的名称,以及当前城市的经度,和纬度

接下来继续看processSearch()方法

private void processSearch(double currentLat, double currentLng, String cityCode) {
        //搜索的工具类
        query = new PoiSearch.Query("", "住宅区", cityCode);
        //keyWord表示搜索字符串,
        //第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)
        //cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
       /* query.setPageSize(10);// 设置每页最多返回多少条poiitem
        query.setPageNum(1);//设置查询页码*/

        poiSearch = new PoiSearch(activity, query);
        //搜素中心点以地图的当前中心点为准,搜索半径是3公里
        poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(currentLat,
                currentLng), 3*1000));
        poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
            @Override
            public void onPoiSearched(PoiResult poiResult, int resCode) {
                /*  getTitle();//海棠-小区的名字
                    getCityName() 成都市
                    getProvinceName() 四川省
                    getSnippet() 海昌南路87号
                */
                if(resCode == 1000 ){//搜索成功
                    List<SearchPOIBean> res = new ArrayList<>();
                    ArrayList<PoiItem> pois = poiResult.getPois();
                    for(int i = 0;i<pois.size();i++){
                        PoiItem poiItem = pois.get(i);
                        SearchPOIBean searchBean = new SearchPOIBean();
                        searchBean.title = poiItem.getTitle();
                        searchBean.detail =poiItem.getProvinceName()+poiItem.getCityName()+poiItem.getSnippet();
                        res.add(searchBean);
                    }
                    showPOIList(res);
                }else{//搜索失败

                }
            }

            @Override
            public void onPoiItemSearched(PoiItem poiItem, int i) {

            }
        });
        poiSearch.searchPOIAsyn();

    }

这里对以上部分代码进行说明

query = new PoiSearch.Query("", "住宅区", cityCode);

Query的第一个参数是要搜索的内容,因为我的需求是,首次进入地图就只展示附近的住宅区,所以搜索内容可以不填。

Query的第二个参数是要搜索内容的分类,这里我写的是住宅区,需要注意的是,分类的名称不能随便乱写,要写高德提供的分类名称,比如,我这里的住宅区,这个分类名称也是从POI编码表里查找的,如下

android开发 高德地图监听用户滑动 高德地图有监听功能吗_ide_02

具体的POI分类码表,各位可以去如下去下载

https://lbs.amap.com/api/webservice/download

Query的第三个参数是城市名,这个把定位的城市名传递进来就行。

当搜索成功之后,会回调onPoiSearched,这时,只需在onPoiSearched中,将获取到的数据展示出来就行了。

现在继续增加一个新的小需求,就是移动地图之后,以地图的中心点为准,根据其附近的住宅区信息,效果如下

android开发 高德地图监听用户滑动 高德地图有监听功能吗_搜索_03

只需添加一个监听即可实现,代码如下

aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {

            }

            @Override
            public void onCameraChangeFinish(CameraPosition cameraPosition) {
                if(TextUtils.isEmpty(currentCityName)){
                    return;
                }
               processSearch(cameraPosition.target.latitude,cameraPosition.target.longitude,currentCityName);
            }
        });

当你移动地图结束后,会导致onCameraChangeFinish被回调,因此你只需在这里重新去根据当前的位置信息,获取附近的数据即可。