对百度地图进行一个简单的封装,一行代码实现地图显示和定位

1,首先定义几个地图定位相关的变量

    private Context context;

    /**
     *  定位相关
     */
    private LocationClient mLocationClient;

    public static BDLocation mLocation;

    private BaiduMap mBaiduMap;

    private LatLng myPosition;

    private MapView baiduMapView;

    public static String latitude;
    public static String longitude;
    public static String city;

2,构建单例

/**
     * 静态内部类的方式构建单例模式
     */

    private BaiduMapHelper(){}

    private static class BaiduMapHolder{

        private static BaiduMapHelper instance= new BaiduMapHelper();

    }

    public static BaiduMapHelper getInstance(){

        return BaiduMapHelper.BaiduMapHolder.instance;
    }

3,初始化相关配置

 /**
     * 传入需要的參數
     * @param
     * @param holdingActivity
     * @return
     */

    public final BaiduMapHelper params (BaseActivity holdingActivity){

        this.context=holdingActivity;
        return this;

    }


    /**
     * 初始化配置
     * @param
     * @return
     */

    public final BaiduMapHelper init(MapView baiduMapView){

        this.baiduMapView= baiduMapView;

        return this;

    }

4,配置定位参数以及设置定位监听

/**
     * 配置定位参数
     */
    public void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备

        option.setCoorType("bd09ll");
        //可选,默认gcj02,设置返回的定位结果坐标系

        int span = 1000;
        option.setScanSpan(0);
        //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的

        option.setIsNeedAddress(true);
        //可选,设置是否需要地址信息,默认不需要

        option.setOpenGps(true);
        //可选,默认false,设置是否使用gps

        option.setLocationNotify(true);
        //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果

        option.setIsNeedLocationDescribe(true);
        //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”

        option.setIsNeedLocationPoiList(true);
        //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到

        option.setIgnoreKillProcess(false);
        //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死

        option.SetIgnoreCacheException(false);
        //可选,默认false,设置是否收集CRASH信息,默认收集
        option.setEnableSimulateGps(false);
        //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
        mLocationClient.setLocOption(option);
    }

    /**
     * 实现定位监听 位置一旦有所改变就会调用这个方法
     * 可以在这个方法里面获取到定位之后获取到的一系列数据
     */
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {

            //获取定位结果
            StringBuffer sb = new StringBuffer(256);
            sb.append("time : ");
            sb.append(location.getTime());    //获取定位时间

            sb.append("\nerror code : ");
            sb.append(location.getLocType());    //获取类型类型

            sb.append("\nlatitude : ");
            sb.append(location.getLatitude());    //获取纬度信息

            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());    //获取经度信息

            sb.append("\nradius : ");
            sb.append(location.getRadius());    //获取定位精准度

            if (location.getLocType() == BDLocation.TypeGpsLocation) {

                // GPS定位结果
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());    // 单位:公里每小时

                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());    //获取卫星数

                sb.append("\nheight : ");
                sb.append(location.getAltitude());    //获取海拔高度信息,单位米

                sb.append("\ndirection : ");
                sb.append(location.getDirection());    //获取方向信息,单位度

                sb.append("\naddr : ");
                sb.append(location.getAddrStr());    //获取地址信息

                sb.append("\ndescribe : ");
                sb.append("gps定位成功");

            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {

                // 网络定位结果
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());    //获取地址信息

                sb.append("\noperationers : ");
                sb.append(location.getOperators());    //获取运营商信息

                sb.append("\ndescribe : ");
                sb.append("网络定位成功");

            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {

                // 离线定位结果
                sb.append("\ndescribe : ");
                sb.append("离线定位成功,离线定位结果也是有效的");

            } else if (location.getLocType() == BDLocation.TypeServerError) {

                sb.append("\ndescribe : ");
                sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因");

            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {

                sb.append("\ndescribe : ");
                sb.append("网络不同导致定位失败,请检查网络是否通畅");

            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {

                sb.append("\ndescribe : ");
                sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");

            }

            sb.append("\nlocationdescribe : ");
            sb.append(location.getLocationDescribe());    //位置语义化信息

            List list = location.getPoiList();    // POI数据
            if (list != null) {
                sb.append("\npoilist size = : ");
                sb.append(list.size());
                for (Poi p : list) {
                    sb.append("\npoi= : ");
                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                }
            }

            mLocation = location;

            latitude= mLocation.getLatitude()+"";
            longitude= mLocation.getLongitude()+"";
            city= mLocation.getCity()+"";

            getLocationInfo(latitude,longitude,city);

//            mCity.setText(location.getCity());
            //TODO  暂时去掉定位层
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(false);
            // 构造定位数据
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            // 设置定位数据
            mBaiduMap.setMyLocationData(locData);
            myPosition = new LatLng(location.getLatitude(), location.getLongitude());
            MapStatus mMapStatus = new MapStatus.Builder()
                    .target(myPosition)
                    .zoom(16)
                    .build();
            MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
            //改变地图状态
            mBaiduMap.setMapStatus(mMapStatusUpdate);
            if (location.getLatitude() != 0 && location.getLongitude() != 0) {
                // getMapShop(location.getLatitude(), location.getLongitude(), null);
            }
            // 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)
            //            mCurrentMarker = BitmapDescriptorFactory
            //                    .fromResource(R.drawable.icon_geo);
            //            MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null);
            //            mBaiduMap.setMyLocationConfiguration(config);
            // 当不需要定位图层时关闭定位图层
            //            mBaiduMap.setMyLocationEnabled(false);
            // Log.i("BaiduLocationApiDem", sb.toString());


            mLocationClient.stop();
        }
    }


    public MyLocationListener getListener(){

        return new MyLocationListener();

    }

5,显示地图以及相关定位信息

public void showLocation(){

        if (baiduMapView== null){
            //只要定位数据,不需要展示地图
        }else {
            //定位,地图都要
            mBaiduMap = baiduMapView.getMap();

            //普通地图
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
            // 设置百度地图的缩放等级为15
            mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15));
            //开启交通图
            mBaiduMap.setTrafficEnabled(false);
            //关闭缩放按钮
            baiduMapView.showZoomControls(false);
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
        }

        //声明LocationClient类
        mLocationClient = new LocationClient(context);
        //注册监听函数

        mLocationClient.registerLocationListener(this.getListener());

        this.getInstance().initLocation();

        //开始定位
        if (mLocationClient.isStarted()) {
            mLocationClient.requestLocation();
        } else {

            mLocationClient.start();
        }


    }

    /**
     * 获取定位信息
     * @param
     * @param longitude
     * @param latitude
     */
    public void getLocationInfo(String latitude, String longitude, String city){
        RxBus.getDefault().post(new FirstEvent("location",latitude,longitude,city));
    }

6,在需要的地方直接调用即可

BaiduMapHelper
                .getInstance()
                .init(null)
                .params(this)
                .showLocation();

        RxBus.getDefault().toObservable(FirstEvent.class)
                //在io线程进行订阅,可以执行一些耗时操作
                .subscribeOn(Schedulers.io())
                //在主线程进行观察,可做UI更新操作
                .observeOn(AndroidSchedulers.mainThread())
                //观察的对象
                .subscribe(new Action1() {
                    @Override
                    public void call(FirstEvent firstEvent) {
                        if (firstEvent.getCode().equals("location")) {
                            Logger.e("城市:::", firstEvent.getCity() + "");
                            Logger.e("经度:::", firstEvent.getLatitude() + "");
                            Logger.e("纬度:::", firstEvent.getLongitude() + "");
                        }
                    }
                });

最后,需要注意一下:传入的上下文需要是全局的,否则会内存泄漏!!!

你可能感兴趣的:(对百度地图进行一个简单的封装,一行代码实现地图显示和定位)