现在有这样一个业务:
1.将地图定位到指定的经纬度位置,当地图停止滑动时搜索附近的地址信息列表,并显示再ListView中。
2.每次滑动地图都需要根据地图中心点位置搜索附近1000米范围内的地址,并显示再列表,直至退出。
下面是具体实现的代码:
一:实例化PoiSearch并设置获取结果的监听器setOnGetPoiSearchResultListener
// 创建POI检索实例 poiSearch = PoiSearch.newInstance(); // 设置监听器 poiSearch.setOnGetPoiSearchResultListener(poiSearchListener); baiduMap = mapView.getMap(); //设置地图中心点位置 MapStatus status = new MapStatus.Builder().target(new LatLng(MyLocation.getInstance().getLocation().getLatitude(), MyLocation.getInstance().getLocation().getLongitude())).build(); searchMoveFinish(status); // 设置地图的缩放级别 MapStatus mapStatus = new MapStatus.Builder().zoom(18).build(); baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
二、获取poi搜索结果监听器:次监听的目的是可以使用户手动模糊搜索
/** * 创建POI检索监听者 */ OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { if (poiResult != null && poiResult.getAllPoi() != null) { adapter.setData(poiResult.getAllPoi()); mSearchResultList.setAdapter(adapter); adapter.notifyDataSetChanged(); } else { ToastUtil.getInstance().showTips(ChooseLocationActivity.this, ToastUtil.TOAST_WARING, "没有更多了!"); } adapter.setSelected(-1); } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { // 获取Place详情页检索结果 ToastUtil.getInstance().showTips(ChooseLocationActivity.this, ToastUtil.TOAST_WARING, "特美的,居然在这里执行了!"); } };
三、监听地图的状态变化
baiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() { @Override public void onMapStatusChangeStart(MapStatus status) { } // 移动结束,在这里需要计算出中心点坐标 @Override public void onMapStatusChangeFinish(MapStatus status) { searchMoveFinish(status); } @Override public void onMapStatusChange(MapStatus status) { } });
第四、(重要)根据地理位置信息搜索指定经纬度1000米范围内的所有的地址信息,此方法是“每次滑动地图后都能够获取地图的中心点位置,并做出相应的操作”的主要方法
private void searchMoveFinish(MapStatus status) { GeoCoder geoCoder = GeoCoder.newInstance(); ReverseGeoCodeOption reverCoder = new ReverseGeoCodeOption(); reverCoder.location(status.target); geoCoder.reverseGeoCode(reverCoder); // geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) { // TODO // stub if (arg0 != null && arg0.getPoiList() != null) { adapter.setData(arg0.getPoiList()); mSearchResultList.setAdapter(adapter); adapter.notifyDataSetChanged(); } else { ToastUtil.getInstance().showTips( ChooseLocationActivity.this, ToastUtil.TOAST_WARING, "没有更多了!"); } } @Override public void onGetGeoCodeResult(GeoCodeResult arg0) { // } }); }
测试过程遇到的一些问题:注意,移动地图后根据,地图中心点进行搜索时,一定不要使用下面这段代码进行处理:
PoiNearbySearchOption option = new PoiNearbySearchOption(); option.location(new LatLng(MyLocation.getInstance().getLocation() .getLatitude(), MyLocation.getInstance().getLocation() .getLongitude())); option.keyword(keyword); option.radius(1000); option.pageNum(10); poiSearch.searchNearby(option);
因为测试过程中发现,如果使用了上述代码进行中心点范围内搜索,则每次 执行过后中心点的经纬度坐标是不会发生相应变化的。应该使用:“第四”部中的方法进行搜索,这样搜索出的结果就是我们所预期的结果