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 了!!!!