Android高德地圖poi檢索仿微信發(fā)送位置實例代碼
最近項目需求把發(fā)送定位模塊改成類似微信發(fā)送位置給好友的效果,我使用了高德地圖實現(xiàn)了一個demo,效果圖如下:

從主界面中我們可以看到中心標記上面顯示的就是我們定位的地址,下面是一個listview列表,第一條item的數(shù)據(jù)就是我們定位得到的地址,下面其余的都是我們根據(jù)定位得到的經(jīng)緯度通過poi周邊搜索得到的地址。我們進行了如下操作:
- 我們點擊列表的item,中心標記會移動到該item對象的地址上面去。
- 我們手動移動地圖的時候,中心標記的地址會發(fā)生相應(yīng)的變化并且下面的列表也會發(fā)生相應(yīng)的變化。
- 根據(jù)關(guān)鍵字poi搜索得到的列表,然后點擊item主界面立馬進行更新操作。
這里貼出主要代碼,首先我們進行地圖地位初始化操作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
mapView.onCreate(savedInstanceState);// 此方法必須重寫
if (aMap == null) {
aMap = mapView.getMap();
// 自定義系統(tǒng)定位小藍點
MyLocationStyle myLocationStyle = new MyLocationStyle();
// 設(shè)置小藍點的圖標
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
fromResource(R.mipmap.ic_location_marker));// 設(shè)置小藍點的圖標
myLocationStyle.strokeColor(0x7F0070D9);// 設(shè)置圓形的邊框顏色
myLocationStyle.radiusFillColor(0x130070D9);// 設(shè)置圓形的填充顏色
// myLocationStyle.anchor(int,int)//設(shè)置小藍點的錨點
myLocationStyle.strokeWidth(1.0f);// 設(shè)置圓形的邊框粗細
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 設(shè)置定位(1)
aMap.setOnCameraChangeListener(this);//手動移動地圖 (2)
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設(shè)置默認定位按鈕是否顯示
//設(shè)置為true表示顯示定位層并可觸發(fā)定位,false表示隱藏定位層并不可觸發(fā)定位,默認是false
aMap.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() {
@Override
public void onGlobalLayout() {
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mCenterMarker.setPositionByPixels(mapView.getWidth() >> 1, mapView.getHeight() >> 1);
mCenterMarker.showInfoWindow();
}
});
//---------------------------------------------初始化正反編碼類 (3)
mGeocoderSearch = new GeocodeSearch(this);
mGeocoderSearch.setOnGeocodeSearchListener(this);
}
我們注意重點關(guān)注在上面的三個回調(diào),1處是定位,有以下兩個回調(diào)方法:
//-----------------地圖定位回調(diào)
//激活定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//設(shè)置定位
mlocationClient.setLocationListener(this);(4)
//設(shè)置為高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//設(shè)置定位參數(shù)
mlocationClient.setLocationOption(mLocationOption);
// 此方法為每隔固定時間會發(fā)起一次定位請求,為了減少電量消耗或網(wǎng)絡(luò)流量消耗,
// 注意設(shè)置合適的定位時間的間隔(最小間隔支持為2000ms),并且在合適時間調(diào)用stopLocation()
// 方法來取消定位請求
// 在定位結(jié)束后,在合適的生命周期調(diào)用onDestroy()方法
// 在單次定位情況下,定位無論成功與否,都無需調(diào)用stopLocation()方法移除請求,定位sdk內(nèi)部會移除
mlocationClient.startLocation();
}
}
//停止定位
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
4處的定位成功后會回調(diào)onLocationChanged這個方法,在這個方法里面我們可以獲得定位到的經(jīng)緯讀,地址,顯示出上面我們設(shè)置的自定義系統(tǒng)定位小藍點出來等等,
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
//這個方法循環(huán)執(zhí)行
mLongitude = aMapLocation.getLongitude();//經(jīng)度
mLatitude = aMapLocation.getLatitude();//緯度
cityCode = aMapLocation.getCityCode();//citycode
}
我們再來分析2處地圖位置改變時回調(diào):
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
/**這個方法很重要,雖然在上述的onLocationChanged方法我們也能獲得坐標點的信息但是我們
通常在這里獲得定位坐標的經(jīng)緯度,獲得了經(jīng)緯度后我們并不能知道該坐標點的具體坐標信息,所以
需要把對應(yīng)的坐標點轉(zhuǎn)化為具體地址,這就是所謂的同步逆地理編碼請求,和定位是黃金搭檔
*/
mCurrentPoint = new LatLonPoint(cameraPosition.target.
latitude, cameraPosition.target.longitude);
// 第一個參數(shù)表示一個Latlng,第二參數(shù)表示范圍多少米,第三個參數(shù)表示是火系坐標系還是GPS原生坐標系
RegeocodeQuery query = new RegeocodeQuery(mCurrentPoint, 200, GeocodeSearch.AMAP);
mGeocoderSearch.getFromLocationAsyn(query);// 設(shè)置同步逆地理編碼請求
}
3處我們做的地理正反編碼回調(diào)如下:
//----------------逆地址編碼回調(diào):坐標->地址
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
if (rCode == 0) {
if (result != null && result.getRegeocodeAddress() != null &&
result.getRegeocodeAddress().getFormatAddress() != null) {
mPoiQuery = new PoiSearch.Query("", "住宿服務(wù)|公司企業(yè)",
result.getRegeocodeAddress().getCityCode());
mPoiQuery.setPageSize(10);// 設(shè)置每頁最多返回多少條poiitem
mPoiQuery.setPageNum(0);//設(shè)置查第一頁
PoiSearch poiSearch = new PoiSearch(this, mPoiQuery);
poiSearch.setOnPoiSearchListener(this);//設(shè)置數(shù)據(jù)返回 (5)
//設(shè)置周邊搜索的中心點以及區(qū)域
poiSearch.setBound(new PoiSearch.SearchBound(mCurrentPoint, 1500, true));
poiSearch.searchPOIAsyn();//開始搜索
} else {
ToastUtil.show(mContext, R.string.no_result);
}
} else {
ToastUtil.show(mContexts, rCode);
}
}
//----------------地址編碼回調(diào):地址->坐標
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
}
我們在這兒進行了poi周邊搜索操作,回調(diào)方法
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == 0) {
if (result != null && result.getQuery() != null) {// 搜索poi的結(jié)果
if (result.getQuery().equals(query)) {// 是否是同一條
poiItems = poiResult.getPois();// 取得第一頁的poiitem數(shù)據(jù),頁數(shù)從數(shù)字0開始
// 當搜索不到poiitem數(shù)據(jù)時,會返回含有搜索關(guān)鍵字的城市信息
List<SuggestionCity> suggestionCities = poiResult
.getSearchSuggestionCitys();
/**
* listviw具體操作邏輯
*/
}
} else if (suggestionCities != null
&& suggestionCities.size() > 0) {
showSuggestCity(suggestionCities);
}else {
ToastUtil.show(mContexts, "對不起,沒有搜索到相關(guān)數(shù)據(jù)!");
}
}
}
@Override
public void onPoiItemSearched(PoiItem poiitem, int rcode) {
}
/**
* poi沒有搜索到數(shù)據(jù),返回一些推薦城市的信息
*/
private void showSuggestCity(List<SuggestionCity> cities) {
String infomation = "推薦城市\(zhòng)n";
for (int i = 0; i < cities.size(); i++) {
infomation += "城市名稱:" + cities.get(i).getCityName() + "城市區(qū)號:"
+ cities.get(i).getCityCode() + "城市編碼:"
+ cities.get(i).getAdCode() + "\n";
}
ToastUtil.show(this, infomation);
}
類似的含關(guān)鍵字的poi搜索也是類似的:
// 第一個參數(shù)表示搜索字符串,第二個參數(shù)表示poi搜索類型,第三個參數(shù)表示poi搜索區(qū)域(空字符串代表全國)
mPoiQuery = new PoiSearch.Query(key, "", cityCode);
mPoiSearch = new PoiSearch(this, mPoiQuery);
mPoiQuery.setPageSize(15);// 設(shè)置每頁最多返回多少條poiitem
mPoiQuery.setPageNum(0);//設(shè)置查第一頁
mPoiSearch.setOnPoiSearchListener(this);
// 設(shè)置搜索區(qū)域為以lp點為圓心,其周圍5000米范圍
LatLonPoint lp=new LatLonPoint(latitude,longitude);
mPoiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));
mPoiSearch.searchPOIAsyn();//開始搜索最后還有一個知識點就是我們點擊item的時候地圖自動去移動的實現(xiàn),其實就是aMap.moveCamera方法去實現(xiàn)的,它會自動調(diào)用onCameraChangeFinish方法走的流程還是和我們手動拖動地圖一樣的。
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(poiItem.getLatLonPoint().getLatitude(), poiItem.getLatLonPoint().getLongitude()), 20));
基本上就是這樣了,至于一些細節(jié)方面自己去調(diào)節(jié)和優(yōu)化吧,哪些問題都不大。以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android?實現(xiàn)自定義圓形進度條的三種常用方法
這篇文章主要介紹了Android?實現(xiàn)自定義圓形進度條的三種常用方法的相關(guān)資料,需要的朋友可以參考下2023-03-03
Android編程實現(xiàn)PendingIntent控制多個鬧鐘的方法
這篇文章主要介紹了Android編程實現(xiàn)PendingIntent控制多個鬧鐘的方法,涉及PendingIntent屬性設(shè)置與使用的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12
Kotlin開發(fā)中與if等價的takeIf與takeUnless詳解
這篇文章主要介紹了Kotlin開發(fā)中與if等價的takeIf與takeUnless使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01
規(guī)避Android開發(fā)中內(nèi)存泄漏陷阱的解決方案
在Android開發(fā)中,內(nèi)存泄漏是一個常見但容易被忽視的問題,它會導致應(yīng)用程序占用過多的內(nèi)存資源,最終影響應(yīng)用的性能和用戶體驗,本文將深入探討Android常見的內(nèi)存泄漏問題,并提供優(yōu)化指南,需要的朋友可以參考下2024-05-05
Android中ViewPager獲取當前顯示的Fragment
這篇文章主要介紹了Android中ViewPager獲取當前顯示的Fragment的兩種方法,一種是使用 getSupportFragmentManager().findFragmentByTag()方法,另一種是重寫適配器的 setPrimaryItem()方法,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
Android 開發(fā)手機(三星)拍照應(yīng)用照片旋轉(zhuǎn)問題解決辦法
這篇文章主要介紹了Android 開發(fā)手機(三星)拍照應(yīng)用照片旋轉(zhuǎn)問題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android使用CoordinatorLayout實現(xiàn)底部彈出菜單
這篇文章主要為大家詳細介紹了Android使用CoordinatorLayout實現(xiàn)底部彈出菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
關(guān)于Android Device Monitor 無法打開問題
大家好,本篇文章主要講的是關(guān)于Android Device Monitor 無法打開問題,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01

