Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇
2016-05-20 10:14
811 查看
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就好了。
可以看到,方法中传入了一个LatLng对象,这个怎么来了?当然就是通过定位得到的,才能获取当前位置附近的大厦楼宇啊。
最后,我们想实现的效果更好一点,比如在地图上拖拽的时候,附近位置也发生改变怎么办了?
这个也很简单,只需要监听onMapStatusChangeFinish(MapStatus mapStatus)函数就可以:
获取到新的位置在传入方法,更新适配器就ok了。
拖拽地图更改后效果图:
最后布局代码xml如下:
地图显示和地理位置列表1:1比例就行了
在AndroidManifest.xml文件里面不要忘记注册服务和添加百度地图申请的KEY,以及app访问权限
OK 了!!!!
反地理编码就是将地理坐标转换成具体的地址信息,通过百度的坐标定位引擎,插叙出坐标对应的物体所在的行政区划、街道等信息
在地图上点击的时候,或者拖动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 了!!!!
相关文章推荐
- 在Android Studio中使用Lambda表达式
- 给大家分享下仿QQ消息页面横向滑出菜单,Item内容较多的情况
- 【android】:android与java的关系
- Android在线自动更新的实现
- Android图片压缩(质量压缩和尺寸压缩)
- 关于listview的onitem方法点击无效
- 手把手教你写框架之ShykyAnnotations - 开头篇
- Android与服务器端通信方式(二)之Socket详解
- Android之ConnectivityManager
- Android 高仿淘宝时间轴物流信息
- Android studio 导入.9.png图片报错
- Android 混淆代码,使自己的apk更安全
- Android Scroll分析(三)——ViewDragHelper
- Android关于透明度对应表
- Android程序结构--MVP模式
- android 之Fragment相关
- android 手机SD卡读写操作(以txt文本为例)实现步骤
- android 使用Activity类布局时怎样让图片居中
- Android IOS WebRTC 音视频开发总结(七一)-- H265/H264有何不同
- Android手机内存中文件的读写方法小结