Android高德地图poi检索仿微信发送位置
最近項目需求把發送定位模塊改成類似微信發送位置給好友的效果,我使用了高德地圖實現了一個demo,效果圖如下:
從主界面中我們可以看到中心標記上面顯示的就是我們定位的地址,下面是一個listview列表,第一條item的數據就是我們定位得到的地址,下面其余的都是我們根據定位得到的經緯度通過poi周邊搜索得到的地址。我們進行了如下操作:
這里貼出主要代碼,首先我們進行地圖地位初始化操作:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_map);mapView.onCreate(savedInstanceState);// 此方法必須重寫if (aMap == null) {aMap = mapView.getMap();// 自定義系統定位小藍點MyLocationStyle myLocationStyle = new MyLocationStyle();// 設置小藍點的圖標myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_location_marker));// 設置小藍點的圖標 myLocationStyle.strokeColor(0x7F0070D9);// 設置圓形的邊框顏色myLocationStyle.radiusFillColor(0x130070D9);// 設置圓形的填充顏色 // myLocationStyle.anchor(int,int)//設置小藍點的錨點myLocationStyle.strokeWidth(1.0f);// 設置圓形的邊框粗細aMap.setMyLocationStyle(myLocationStyle);aMap.setLocationSource(this);// 設置定位監聽(1)aMap.setOnCameraChangeListener(this);//手動移動地圖監聽 (2)aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設置默認定位按鈕是否顯示//設置為true表示顯示定位層并可觸發定位,false表示隱藏定位層并不可觸發定位,默認是falseaMap.setMyLocationEnabled(true);aMap.moveCamera(CameraUpdateFactory.zoomTo(17.5f));}//------------------------------------------添加中心標記mMarkerOptions = new MarkerOptions();mMarkerOptions.draggable(false);//可拖放性mMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_tips_nearby));mCenterMarker = aMap.addMarker(mMarkerOptions);ViewTreeObserver vto = mapView.getViewTreeObserver();vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);mCenterMarker.setPositionByPixels(mapView.getWidth() >> 1, mapView.getHeight() >> 1);mCenterMarker.showInfoWindow();}});//---------------------------------------------初始化正反編碼類 (3)mGeocoderSearch = new GeocodeSearch(this);mGeocoderSearch.setOnGeocodeSearchListener(this);}我們注意重點關注在上面的三個監聽回調,1處是定位監聽,有以下兩個回調方法:
//-----------------地圖定位回調//激活定位@Overridepublic void activate(OnLocationChangedListener onLocationChangedListener) {mListener = onLocationChangedListener;if (mlocationClient == null) {mlocationClient = new AMapLocationClient(this);mLocationOption = new AMapLocationClientOption();//設置定位監聽mlocationClient.setLocationListener(this);(4)//設置為高精度定位模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//設置定位參數mlocationClient.setLocationOption(mLocationOption);// 此方法為每隔固定時間會發起一次定位請求,為了減少電量消耗或網絡流量消耗,// 注意設置合適的定位時間的間隔(最小間隔支持為2000ms),并且在合適時間調用stopLocation()// 方法來取消定位請求// 在定位結束后,在合適的生命周期調用onDestroy()方法// 在單次定位情況下,定位無論成功與否,都無需調用stopLocation()方法移除請求,定位sdk內部會移除mlocationClient.startLocation();}}//停止定位@Overridepublic void deactivate() {mListener = null;if (mlocationClient != null) {mlocationClient.stopLocation();mlocationClient.onDestroy();}mlocationClient = null;}4處的監聽定位成功后會回調onLocationChanged這個方法,在這個方法里面我們可以獲得定位到的經緯讀,地址,顯示出上面我們設置的自定義系統定位小藍點出來等等,
@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {//這個方法會循環執行mLongitude = aMapLocation.getLongitude();//經度mLatitude = aMapLocation.getLatitude();//緯度cityCode = aMapLocation.getCityCode();//citycode}我們再來分析2處地圖位置改變時回調:
@Overridepublic void onCameraChange(CameraPosition cameraPosition) {}@Overridepublic void onCameraChangeFinish(CameraPosition cameraPosition) {/**這個方法很重要,雖然在上述的onLocationChanged方法我們也能獲得坐標點的信息但是我們通常在這里獲得定位坐標的經緯度,獲得了經緯度后我們并不能知道該坐標點的具體坐標信息,所以需要把對應的坐標點轉化為具體地址,這就是所謂的同步逆地理編碼請求,和定位是黃金搭檔*/mCurrentPoint = new LatLonPoint(cameraPosition.target.latitude, cameraPosition.target.longitude);// 第一個參數表示一個Latlng,第二參數表示范圍多少米,第三個參數表示是火系坐標系還是GPS原生坐標系RegeocodeQuery query = new RegeocodeQuery(mCurrentPoint, 200, GeocodeSearch.AMAP);mGeocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求}3處我們做的地理正反編碼回調如下:
//----------------逆地址編碼回調:坐標->地址@Overridepublic void onRegeocodeSearched(RegeocodeResult result, int rCode) {if (rCode == 0) {if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {/*** 汽車服務|汽車銷售|汽車維修|摩托車服務|餐飲服務|購物服務|生活服務|* 體育休閑服務|醫療保健服務|住宿服務|風景名勝|商務住宅|政府機構及社會團體* |科教文化服務|交通設施服務|金融保險服務|公司企業|道路附屬設施|地名地址信息|公共設施*/mPoiQuery = new PoiSearch.Query("", "住宿服務|公司企業", result.getRegeocodeAddress().getCityCode());mPoiQuery.setPageSize(10);// 設置每頁最多返回多少條poiitemmPoiQuery.setPageNum(0);//設置查第一頁PoiSearch poiSearch = new PoiSearch(this, mPoiQuery);poiSearch.setOnPoiSearchListener(this);//設置數據返回的監聽器 (5)//設置周邊搜索的中心點以及區域poiSearch.setBound(new PoiSearch.SearchBound(mCurrentPoint, 1500, true)); poiSearch.searchPOIAsyn();//開始搜索} else {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.show(mContexts, rCode);}}//----------------地址編碼回調:地址->坐標@Overridepublic void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {}我們在這兒進行了poi周邊搜索操作,回調方法
@Overridepublic void onPoiSearched(PoiResult result, int rcode) {if (rcode == 0) {if (result != null && result.getQuery() != null) {// 搜索poi的結果if (result.getQuery().equals(query)) {// 是否是同一條poiItems = poiResult.getPois();// 取得第一頁的poiitem數據,頁數從數字0開始// 當搜索不到poiitem數據時,會返回含有搜索關鍵字的城市信息List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();/*** listviw具體操作邏輯*/ }} else if (suggestionCities != null&& suggestionCities.size() > 0) {showSuggestCity(suggestionCities);}else {ToastUtil.show(mContexts, "對不起,沒有搜索到相關數據!");}}}@Overridepublic void onPoiItemSearched(PoiItem poiitem, int rcode) {}/*** poi沒有搜索到數據,返回一些推薦城市的信息*/private void showSuggestCity(List<SuggestionCity> cities) {String infomation = "推薦城市\n";for (int i = 0; i < cities.size(); i++) {infomation += "城市名稱:" + cities.get(i).getCityName() + "城市區號:"+ cities.get(i).getCityCode() + "城市編碼:"+ cities.get(i).getAdCode() + "\n";}ToastUtil.show(this, infomation);}類似的含關鍵字的poi搜索也是類似的:
// 第一個參數表示搜索字符串,第二個參數表示poi搜索類型,第三個參數表示poi搜索區域(空字符串代表全國)mPoiQuery = new PoiSearch.Query(key, "", cityCode);mPoiSearch = new PoiSearch(this, mPoiQuery);mPoiQuery.setPageSize(15);// 設置每頁最多返回多少條poiitemmPoiQuery.setPageNum(0);//設置查第一頁mPoiSearch.setOnPoiSearchListener(this);// 設置搜索區域為以lp點為圓心,其周圍5000米范圍LatLonPoint lp=new LatLonPoint(latitude,longitude);mPoiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));mPoiSearch.searchPOIAsyn();//開始搜索最后還有一個知識點就是我們點擊item的時候地圖自動去移動的實現,其實就是aMap.moveCamera方法去實現的,它會自動調用onCameraChangeFinish方法走的流程還是和我們手動拖動地圖一樣的。
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(poiItem.getLatLonPoint().getLatitude(), poiItem.getLatLonPoint().getLongitude()), 20));基本上就是這樣了,至于一些細節方面自己去調節和優化吧,哪些問題都不大。武漢這幾天都是陰雨連綿,可能影響了心情吧,人也跟著抑郁起來了,今天難得出大太陽了,希望今年不管技術還是感情都能有所收獲O(∩_∩)O哈哈~
總結
以上是生活随笔為你收集整理的Android高德地图poi检索仿微信发送位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端理解base64
- 下一篇: 简单xss接收cookie平台的搭建以及