android 百度地图逆地理编码,坐标转位置信息。

1权限

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问系统接口提供的卫星定位信息-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

2:依赖库(项目中只用到了定位,以及逆地理编码),懒省事用了依赖,当然也可以去百度开放平台下载so库,jar包,aar包导入

 //百度全量定位
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Location_All:9.3.7'
    //百度地图工具
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0'
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.5.4'

3:定位:

public class BaiDuLocation {

 /**
     * 初始化定位参数配置
     */

    public static void initLocationOption() {
//定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
        LocationClient locationClient = null;
        try {
            locationClient = new LocationClient(App.getContext());
        } catch (Exception e) {
            e.printStackTrace();
        }
//声明LocationClient类实例并配置定位参数
        LocationClientOption locationOption = new LocationClientOption();
        MyLocationListener myLocationListener = new MyLocationListener();
//注册监听函数
        locationClient.registerLocationListener(myLocationListener);
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
        locationOption.setCoorType("bd09ll");
//可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        locationOption.setScanSpan(1000);
//可选,设置是否需要地址信息,默认不需要
        locationOption.setIsNeedAddress(true);
//可选,设置是否需要地址描述
        locationOption.setIsNeedLocationDescribe(true);
//可选,设置是否需要设备方向结果
        locationOption.setNeedDeviceDirect(false);
//可选,默认false,设置是否当卫星定位有效时按照1S1次频率输出卫星定位结果
        locationOption.setLocationNotify(true);
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
        locationOption.setIgnoreKillProcess(true);
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        locationOption.setIsNeedLocationDescribe(true);
//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        locationOption.setIsNeedLocationPoiList(true);
//可选,默认false,设置是否收集CRASH信息,默认收集
        locationOption.SetIgnoreCacheException(false);
//可选,默认false,设置是否开启卫星定位
        locationOption.setOpenGnss(true);
//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
        locationOption.setIsNeedAltitude(false);
//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
        locationOption.setOpenAutoNotifyMode();
//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
        locationOption.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
        locationClient.setLocOption(locationOption);
//开始定位
        locationClient.start();
    }

    /**
     * 实现定位回调
     */
    public static class MyLocationListener extends BDAbstractLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明

            //获取纬度信息
            double latitude = location.getLatitude();
            //获取经度信息
            double longitude = location.getLongitude();
            mLatLng = new LatLng(latitude, longitude);

            //获取定位精度,默认值为0.0f
            float radius = location.getRadius();
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
            String coorType = location.getCoorType();
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
            int errorCode = location.getLocType();

            
            //逆地理编码
            getGeoAddress(latitude,longitude);


            LogUtil.e("传入的位置lat:" + mLatLng);
        }


    }
}

4:逆地理编码

public static void getGeoAddress(double latitude, double longitude) {
        mCoder = GeoCoder.newInstance();

        mLatLng = new LatLng(latitude, longitude);


        OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {

            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
            }

            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
                SearchResult.ERRORNO error = reverseGeoCodeResult.error;
                int status = reverseGeoCodeResult.status;

//                if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//                    //没有找到检索结果
//                    LogUtil.e("没有找到检索位置"+"error:"+error+",status:"+status);
//                    return;
//                } else {
                    //详细地址
                    String address = reverseGeoCodeResult.getAddress();
                    //行政区号
                    int adCode = reverseGeoCodeResult.getCityCode();
                    LogUtil.e("位置信息:" + address);
//                }
            }
        };

        mCoder.setOnGetGeoCodeResultListener(listener);


        mCoder.reverseGeoCode(new ReverseGeoCodeOption()
                .location(mLatLng)
                // 设置是否返回新数据 默认值0不返回,1返回
                .newVersion(1)
                // POI召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。默认值为1000
                .radius(500));
        LogUtil.e("位置信息:纬度:" + latitude + ",经度:" + longitude + ",坐标转地址:" + mLatLng);

        mCoder.destroy();
    }

5:application中初始化

DKInitializer.setAgreePrivacy(this,true);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
        LocationClient.setAgreePrivacy(true);

        BaiDuLocation.initLocationOption();

上面四行是必要的,不然会有报错,或是逆地理编码返回null的问题。最后一行就是我上面贴的定位的代码。

6:混淆

proguard-rules.pro中加入混淆:

#百度地图
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-keep class com.baidu.vi.** {*;}
-dontwarn com.baidu.**

效果图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值