Android 百度地圖—反地理編碼—擷取目前位置附近的大廈樓宇
反地理編碼就是将地理坐标轉換成具體的位址資訊,通過百度的坐标定位引擎,插叙出坐标對應的物體所在的行政區劃、街道等資訊
在地圖上點選的時候,或者拖動marker的時候得到的LatLng對象,就可以通過反地理編碼得到具體的位址了。
百度地圖反地理編碼實作類似添加收貨位址選擇所在位置或者附近的地點,效果圖:

先檢視百度地圖api http://developer.baidu.com/map/android_refer/com/baidu/mapapi/search/geocode/OnGetGeoCoderResultListener.html
實作很簡單,監聽OnGetGeoCoderResultListener,反地理編碼查詢結果回調函數和地理編碼查詢結果回調函數。
void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) 傳回結果 result.getPoiList()方法可以擷取一個PoiInfo類的List集合
再通過Adapter擴充卡顯示到listview就好了。
private void getdata(LatLng ll) {
GeoCoder geoCoder = GeoCoder.newInstance();
//
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
// 反地理編碼查詢結果回調函數
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null
|| result.error != SearchResult.ERRORNO.NO_ERROR) {
// 沒有檢測到結果
Toast.makeText(MainActivity.this, "抱歉,未能找到結果",
Toast.LENGTH_LONG).show();
return;
}
poiInfos = (ArrayList<PoiInfo>) result.getPoiList();
adapter = new PoiListAdapter(MainActivity.this, poiInfos);
iv_item.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
// 地理編碼查詢結果回調函數
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null
|| result.error != SearchResult.ERRORNO.NO_ERROR) {
// 沒有檢測到結果
}
}
};
// 設定地理編碼檢索監聽者
geoCoder.setOnGetGeoCodeResultListener(listener);
//
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(ll));
}
可以看到,方法中傳入了一個LatLng對象,這個怎麼來了?當然就是通過定位得到的,才能擷取目前位置附近的大廈樓宇啊。
// 開啟定位圖層
mBaiduMap.setMyLocationEnabled(true);
mBaiduMap.setMaxAndMinZoomLevel(18, 18);
mMapView.showZoomControls(false);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打開gps
option.setCoorType("bd09ll"); // 設定坐标類型
option.setScanSpan(1000);
option.setAddrType("all");
option.setIsNeedAddress(true);
mLocClient.setLocOption(option);
mLocClient.start();
/**
* 定位SDK監聽函數
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 銷毀後不在處理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設定開發者擷取到的方向資訊,順時針0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) { //時候第一次定位
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
getdata(ll);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
最後,我們想實作的效果更好一點,比如在地圖上拖拽的時候,附近位置也發生改變怎麼辦了?
這個也很簡單,隻需要監聽onMapStatusChangeFinish(MapStatus mapStatus)函數就可以:
//地圖狀态改變相關監聽
mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus arg0) {
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
LatLng cenpt = mapStatus.target;
getdata(cenpt);
}
@Override
public void onMapStatusChange(MapStatus arg0) {
}
});
擷取到新的位置在傳入方法,更新擴充卡就ok了。
拖拽地圖更改後效果圖:
最後布局代碼xml如下:
地圖顯示和地理位置清單1:1比例就行了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/background"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="48dp"
android:background="@color/top_color" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="選擇位址"
android:textColor="@color/white"
android:textSize="18sp" />
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" >
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/lo_img" />
</RelativeLayout>
<ListView
android:id="@+id/iv_item"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:fadingEdge="none" >
</ListView>
</LinearLayout>
在 AndroidManifest.xml檔案裡面不要忘記注冊服務和添加百度地圖申請的KEY,以及app通路權限
<!-- 這個權限用于進行網絡定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<!-- 這個權限用于通路GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<!-- 用于通路wifi網絡資訊,wifi資訊會用于進行網絡定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<!-- 擷取營運商資訊,用于支援提供營運商資訊相關的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<!-- 這個權限用于擷取wifi的擷取權限,wifi資訊會用來進行網絡定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- 用于讀取手機目前的狀态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<!-- 寫入擴充存儲,向擴充卡寫入資料,用于寫入離線定位資料 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<!-- 通路網絡,網絡定位需要上網 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權限,使用者寫入離線定位資料 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<span style="white-space:pre"> </span><service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="百度地圖官網申請的APP KEY" />
OK 了!!!!