高德地图之逆地理编码
来源:互联网 发布:舆情监测软件价格 编辑:程序博客网 时间:2024/04/28 07:13
上一篇讲述了地理编码的使用,没看的朋友可以看看http://blog.csdn.net/hedong_77/article/details/54287292,Ok,我们继续来看你地理编码,首先要理解它的概念,逆地理编码,又称地址解析服务,是指从已知的经纬度坐标到对应的地址描述(如行政区划、街区、楼层、房间等)的转换。常用于根据定位的坐标来获取该地点的位置详细信息,与定位功能是黄金搭档。也就是坐标转地址。
逆地理编码就很实用了,很多时候后台都会返回经纬度,然后APP端根据经纬度来定位,最常见的,好的,不说废话,来看看:
跟地理编码类似,只是在不同的方法里面做请求返回操作而已:
1、继承 OnGeocodeSearchListener 监听。
2、构造 GeocodeSearch 对象,并设置监听。
geocoderSearch = new GeocodeSearch(this);geocoderSearch.setOnGeocodeSearchListener(this);
3、通过 RegeocodeQuery(LatLonPoint point, float radius, java.lang.String latLonType) 设置查询参数,调用 GeocodeSearch 的 getFromLocationAsyn(RegeocodeQuery regeocodeQuery) 方法发起请求。
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200,GeocodeSearch.AMAP);geocoderSearch.getFromLocationAsyn(query);
4、通过回调接口 onRegeocodeSearched 解析返回的结果。
这里跟地理编码不一样的地方,就是返回方法不同,地理编码是在onGeocodeSearched里面做相应操作。
@Overridepublic void onRegeocodeSearched(RegeocodeResult result, int rCode) { dismissDialog(); if (rCode == 1000) { if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) { addressName = result.getRegeocodeAddress().getFormatAddress() + "附近"; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom( AMapUtil.convertToLatLng(latLonPoint), 15)); regeoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint)); ToastUtil.show(ReGeocoderActivity.this, addressName); } else { ToastUtil.show(ReGeocoderActivity.this, R.string.no_result); } } else { ToastUtil.showerror(this, rCode); }}
来看全部代码:
/** * 逆地理编码功能介绍 */public class ReGeocoderActivity extends Activity implements OnGeocodeSearchListener, OnClickListener, OnMarkerClickListener { private ProgressDialog progDialog = null; private GeocodeSearch geocoderSearch; private String addressName; private AMap aMap; private MapView mapView; private LatLonPoint latLonPoint = new LatLonPoint(39.90865, 116.39751); private Marker regeoMarker; private ExecutorService mExecutorService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.geocoder_activity); /* * 设置离线地图存储目录,在下载离线地图或初始化地图设置; * 使用过程中可自行设置, 若自行设置了离线地图存储的路径, * 则需要在离线地图下载和使用地图页面都进行路径设置 * */ //Demo中为了其他界面可以使用下载的离线地图,使用默认位置存储,屏蔽了自定义设置// MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 init(); } /** * 初始化AMap对象 */ private void init() { if (aMap == null) { aMap = mapView.getMap(); regeoMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f) .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_RED))); aMap.setOnMarkerClickListener(this); } geocoderSearch = new GeocodeSearch(this); geocoderSearch.setOnGeocodeSearchListener(this); progDialog = new ProgressDialog(this); getAddresses(); } /** * 方法必须重写 */ @Override protected void onResume() { super.onResume(); mapView.onResume(); } /** * 方法必须重写 */ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /** * 方法必须重写 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } /** * 方法必须重写 */ @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); if (mExecutorService != null) { mExecutorService.shutdownNow(); } } /** * 显示进度条对话框 */ public void showDialog() { progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progDialog.setIndeterminate(false); progDialog.setCancelable(true); progDialog.setMessage("正在获取地址"); progDialog.show(); } /** * 隐藏进度条对话框 */ public void dismissDialog() { if (progDialog != null) { progDialog.dismiss(); } } /** * 响应逆地理编码 */ public void getAddress(final LatLonPoint latLonPoint) { showDialog(); RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系 geocoderSearch.getFromLocationAsyn(query);// 设置异步逆地理编码请求 } /** * 地理编码查询回调 */ @Override public void onGeocodeSearched(GeocodeResult result, int rCode) { } /** * 逆地理编码回调 */ @Override public void onRegeocodeSearched(RegeocodeResult result, int rCode) { dismissDialog(); if (rCode == AMapException.CODE_AMAP_SUCCESS) { if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) { addressName = result.getRegeocodeAddress().getFormatAddress() + "附近"; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom( AMapUtil.convertToLatLng(latLonPoint), 15)); regeoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint)); ToastUtil.show(ReGeocoderActivity.this, addressName); } else { ToastUtil.show(ReGeocoderActivity.this, R.string.no_result); } } else { ToastUtil.showerror(this, rCode); } } @Override public void onClick(View v) { } /** * 响应逆地理编码的批量请求 */ private void getAddresses() { if (mExecutorService == null) { mExecutorService = Executors.newSingleThreadExecutor(); } List<LatLonPoint> geopointlist = readLatLonPoints(); for (final LatLonPoint point : geopointlist) { mExecutorService.submit(new Runnable() { @Override public void run() { try { RegeocodeQuery query = new RegeocodeQuery(point, 200, GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系 RegeocodeAddress result = geocoderSearch.getFromLocation(query);// 设置同步逆地理编码请求 if (result != null && result.getFormatAddress() != null) { aMap.addMarker(new MarkerOptions() .position(new LatLng(point.getLatitude(), point.getLongitude())) .title(result.getFormatAddress())); } } catch (AMapException e) { Message msg = msgHandler.obtainMessage(); msg.arg1 = e.getErrorCode(); msgHandler.sendMessage(msg); } } }); } } private Handler msgHandler = new Handler() { public void handleMessage(Message msg) { ToastUtil.showerror(ReGeocoderActivity.this, msg.arg1); } }; private List<LatLonPoint> readLatLonPoints() { List<LatLonPoint> points = new ArrayList<LatLonPoint>(); for (int i = 0; i < coords.length; i += 2) { points.add(new LatLonPoint(coords[i + 1], coords[i])); } return points; } //测试的经纬度 private double[] coords = {116.339925, 39.976587, 116.328467, 39.976357, 116.345289, 39.966556, 116.321428, 39.967477, 116.358421, 39.961556, 116.366146, 39.961293, 116.359666, 39.953234, 116.373013, 39.948628, 116.355374, 39.94037, 116.41713, 39.940666, 116.433309, 39.940929, 116.461933, 39.949319, 116.473907, 39.938461, 116.478971, 39.933854, 116.491631, 39.96603, 116.489399, 39.971029, 116.495364, 39.98517, 116.530812, 39.99556, 116.5607, 39.996023, 116.525982, 40.022825, 116.568511, 40.016843, 116.584046, 40.014608, 116.422599, 40.012439, 116.44131, 40.00616, 116.39303, 40.026998, 116.384147, 40.039222, 116.388352, 39.928242}; @Override public boolean onMarkerClick(Marker marker) { marker.showInfoWindow(); return false; }}
getAddresses() 方法里面用到线程同步去做请求,因为我们这里是批量加载的。你编码就这么多了。
2 0
- 高德地图之逆地理编码
- 高德地图之地理编码
- 高德地图地理编码和逆地理编码
- 高德地图之地理编码的使用
- 高德地图 正向地理编码 逆向地理编码
- 高德地图地理编码和逆地理编码,以及逆地理编码的时候如何去掉省、市、镇
- 高德地图android sdk 逆地理编码 基本使用方法
- js引入高德地图,加标注,逆地理编码
- 基于高德地图的地理编码
- iOS开发——高德地图调研之显示地图、定位与地理编码等
- 高德地理编码和逆地理编码区别
- 高德地图之反地理编码、线路规划、天气查询
- 高德地图---天气搜索/逆向地理编码/定位
- iOS开发:高德地图显示、定位、反地理编码
- iOS 高德地图反向地理编码 onReGeocodeSearchDone 不回调
- 百度地图之地理编码
- ios 地图大头针固定在地图中心,用用地图中心点左边逆地理编码,及高德云图周边搜索
- 高德地图-根据经纬度获取地址(逆地理编码)
- stm32 SPI NSS引脚的使用配置
- linux美化窗口
- 微信小程序的页面跳转
- Unity3D研究院之使用初始化游戏脚本
- 欢迎使用CSDN-markdown编辑器
- 高德地图之逆地理编码
- Android中pendingIntent的深入理解
- 修改的程序
- Android逆向学习笔记(转载自吾爱破解)
- java 基础知识——01
- 腾讯云服务搭建后,Mysql无密码无法登陆解决方法
- 共轭梯度法
- H.264中NALU、RBSP、SODB的关系 (弄清码流结构)
- 在 Jelly Bean 中使用应用加密