1、定位端、定位监听器,定位图层
/* * 此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。 * Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context */ public LocationClient mLocationClient = null; // BDLocationListener处理定位结果 // MyLocationListener实现两个方法:定位请求回调函数+poi请求回调函数 public BDLocationListener myListener = new MyLocationListener(); // 定位图层 com.eroad.component.locationOverlay locationOverlay = null;
2、设置定位的属性并且开始定位
// 声明LocationClient类 mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(myListener); // 注册监听函数,处理定位返回的数据; LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(1500);// 设置发起定位请求的间隔时间为5000ms option.setLocationMode(LocationMode.Hight_Accuracy); option.setIsNeedAddress(true);// 返回的定位结果包含地址信息 option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向 option.setOpenGps(true);// 是否打开gps进行定位 // 装在定位的属性 mLocationClient.setLocOption(option); // 启动定位sdk mLocationClient.start(); // 设置定位数据 if (mLocationClient != null && mLocationClient.isStarted()) // 请求定位,异步返回,结果在locationListener中获取. mLocationClient.requestLocation(); else Log.d(tag, "locClient is null or not started");
3、定位监听并处理定位图层
/** * @author JL BDLocationListener接口有2个方法需要实现: * 1.接收异步返回的定位结果,参数是BDLocation类型参数。 * 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。 */ public class MyLocationListener implements BDLocationListener { /* * 接收异步返回的定位结果 BDLocation包含详细的定位信息 */ @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub if (location == null) return; StringBuffer sb = new StringBuffer(256); sb.append("当前定位时间 : "); sb.append(location.getTime()); sb.append("\n获取定位类型 : "); sb.append(location.getLocType()); sb.append("\n纬度坐标 : "); sb.append(location.getLatitude()); sb.append("\n经度坐标 : "); sb.append(location.getLongitude()); sb.append("\n定位精度 : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) { // 如果是GPS定位结果 sb.append("\n获取速度(仅gps定位) : "); sb.append(location.getSpeed()); sb.append("\n获取gps锁定用的卫星数 : "); sb.append(location.getSatelliteNumber()); sb.append("\n 获取手机当前的方向 : "); sb.append(location.getDirection()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { // 如果是网络定位结果 sb.append("\n获取详细地址信息: "); sb.append(location.getAddrStr()); sb.append("\n获取运营商信息 : "); sb.append(location.getOperators()); } sb.append("\n 获取手机当前的方向 : "); sb.append(location.getDirection()); // 实现标注item /* * 生成ItemizedOverlay图层用来标注结果点 arg0为mark的Drawable arg1为MapView */ locationOverlay = new com.eroad.component.locationOverlay(mMapView); LocationData locData = new LocationData(); // 手动将位置源置为*,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要使用百度经纬度坐标(bd09ll) locData.latitude = location.getLatitude(); locData.longitude = location.getLongitude(); // 如果不显示定位精度圈,将accuracy赋值为0即可 locData.accuracy = location.getRadius(); // 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。 locData.direction = location.getDerect(); // 开启定位图层接受方向数据功能,当定位数据中有方向时,定位图标会旋转至该方向 locationOverlay.enableCompass(); locationOverlay.setData(locData); /* * setLocationMode:设置定图层显示位模式 ; COMPASS 罗盘态,显示定位方向圈,保持定位图标在地图中心; * FOLLOWING跟随态,保持定位图标在地图中心; NORMAL 普通态: 更新定位数据时不对地图做任何操作; */ locationOverlay .setLocationMode(com.baidu.mapapi.map.MyLocationOverlay.LocationMode.FOLLOWING); Log.i("isCompassEnable:", "" + locationOverlay.isCompassEnable()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(locationOverlay); mMapView.refresh(); mMapView.getController().animateTo( new GeoPoint((int) (locData.latitude * 1e6), (int) (locData.longitude * 1e6))); logMsg(sb.toString()); } // 接收异步返回的POI查询结果 @Override public void onReceivePoi(BDLocation arg0) { // TODO Auto-generated method stub } }
Done!