定位功能以及定位图层的使用

时间:2020-11-28 09:06:08

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!