現在有這樣一個業務:
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);
因為測試過程中發現,如果使用了上述代碼進行中心點范圍內搜索,則每次 執行過后中心點的經緯度坐標是不會發生相應變化的。應該使用:“第四”部中的方法進行搜索,這樣搜索出的結果就是我們所預期的結果