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)); }
// 开启定位图层 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) { } });
拖拽地图更改后效果图:
最后布局代码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>
<!-- 这个权限用于进行网络定位 --> <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 了!!!!