Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇

Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇



反地理编码就是将地理坐标转换成具体的地址信息,通过百度的坐标定位引擎,插叙出坐标对应的物体所在的行政区划、街道等信息

在地图上点击的时候,或者拖动marker的时候得到的LatLng对象,就可以通过反地理编码得到具体的地址了。


百度地图反地理编码实现类似添加收货地址选择所在位置或者附近的地点,效果图:


Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇_第1张图片



先查看百度地图api      http://developer.baidu.com/map/android_refer/com/baidu/mapapi/search/geocode/OnGetGeoCoderResultListener.html


Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇_第2张图片


实现很简单,监听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) 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了。

拖拽地图更改后效果图:

Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇_第3张图片


最后布局代码xml如下:

地图显示和地理位置列表1:1比例就行了




    

        
    

    

        

        
    

    
    


AndroidManifest.xml文件里面不要忘记注册服务和添加百度地图申请的KEY,以及app访问权限

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    



 	
        

        



OK 了!!!!





你可能感兴趣的:(百度地图,android,百度地图,反地理编码,api)