快速接入百度地图定位、描点

来源:互联网 发布:鸿坤地产集团知乎 编辑:程序博客网 时间:2024/06/05 06:45

这里整理一下接入 百度地图 的流程,做一下记录(基于 Kotlin 语言开发)。

第一步,肯定还是注册账号,创建应用了

先来到百度地图 首页 登录自己或公司的 百度账号(公司项目,一般都是由公司提供账号)。
登录成功之后,首页有一个控制台

这里写图片描述

  • 点击上图标记的控制台,然后选择 【创建应用】

    这里写图片描述

这里只是针对 Android 项目,所以你需要选中 【应用类型】 为 Android SDK , 剩下的就是输入所对应的应用名称,这个一般是和你的项目名称保持一致。所以,输入名称的时候你需要先确定好自己的项目名。当然,后续如果 APP 名称调整了,导致 sdk 无效的话,直接就再次创建一个 相同名字的应用,更换一下 APP_KEY 就好了。

然后就是 标注的地方, 这里获取 发布版和开发版 SHA1 我之前一篇博客整理过(传送)。这里 开发版SHA1 虽然没有必填,但是最好还是添加一下。这样的话,可以保证你在开发过程中,可以直接在调试模式看到地图效果,

这里就不用多说了,直接填入你的 applicationId 。

然后下面就是点击提交, 然后自动跳到应用列表页。这里可以获取到你对应 App 的 APP_KEY 了。

好了,到这里我们的项目就创建完成了,接下来就是开始接入了。

下载并集成 SDK

上面 APP_KEY 获取到之后,我们需要来下载相应的 SDK 开发包(下载地址),这里你可以根据自己需求,选择对应功能进行下载。如果你不需要参照 官方Demo 的话,可以直接下载 开发包。如果需要参照,你可以选择下载 示例代码 ,并且我这里提供一个 百度地图Demo 可以使用的 APP_KEY : ilLQfbEIhHAFMdAbjLKNvcZGrZNqVDDc, 你把demo 跑起来之后,把 manifest 中的 APP_KEY 换掉。我这里当时调试的时候,因为 demo 提示 key 值不对,所以自己创建的一个。

资源文件下载完成之后,把 libs 下的 jar 包,都拷贝到你自己项目的 app/libs 下面,至于其他文件夹下的 so 文件,请连带着文件夹,一起拷贝到 src/main/jniLibs目录(可以自己手动新建)。
添加完成之后,对于每个jar文件,右键-选择Add As Library,导入到工程中。对应在 build.gradle 生成工程所依赖的 jar 文件格式如下:

implementation files('libs/BaiduLBS_Android.jar')

添加权限

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!--//获取设备网络状态,禁用后无法获取网络状态-->    <uses-permission android:name="android.permission.INTERNET" />    <!--//网络权限,当禁用后,无法进行检索等相关业务-->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!--//读取设备硬件信息,统计数据-->    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />    <!--//读取系统信息,包含系统版本等信息,用作统计-->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <!--//获取设备的网络状态,鉴权所需网络代理-->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!--//允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->    <uses-permission android:name="android.permission.WRITE_SETTINGS" />    <!--//获取统计数据-->    <uses-permission android:name="android.permission.GET_TASKS" />    <!--//鉴权所需该权限获取进程列表-->    <uses-permission android:name="android.permission.CAMERA" />    <!--//使用步行AR导航,配置Camera权限-->    <supports-screens        android:anyDensity="true"        android:largeScreens="true"        android:normalScreens="false"        android:resizeable="true"        android:smallScreens="true" />    <!-- OpenGLES 2.0 -->    <uses-feature        android:glEsVersion="0x00020000"        android:required="true" /><application>    ····     <meta-data            android:name="com.baidu.lbsapi.API_KEY"            android:value="{替换你的APP_KEY}" />     <!-- 定位service -->        <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" />    ····</application>

配置混淆代码如下:

-keep class com.baidu.** {*;}-keep class vi.com.** {*;}    -dontwarn com.baidu.**

调用

在 Application 中 调用一下方法进行 百度地图 SDK 初始化:

// 初始化百度地图SDKInitializer.initialize(this)
  • 基础定位功能
private var mLocationClient: LocationClient? = null override fun create(savedInstanceState: Bundle?) {        mLocationClient = LocationClient(this)        getLocation(BDLocationListener { location ->            val province = location?.province ?: ""    //获取省份            val city = location?.city ?: ""   //获取城市            val district = location?.district ?: ""    //获取区县            val street = location?.street ?: ""   //获取街道信息            lat = location?.latitude ?: 0.0            long = location?.longitude ?: 0.0            add_sales_record_address.text = province + city + district + street        })        init()    }    /**     * 定位,获取当前位置信息     */    fun getLocation(listener: BDLocationListener?) {        mLocationClient?.registerLocationListener(listener)//        { location ->//            val addr = location?.addrStr ?: ""    //获取详细地址信息//            val country = location?.country ?: ""    //获取国家//            val province = location?.province ?: ""    //获取省份//            val city = location?.city ?: ""   //获取城市//            val district = location?.district ?: ""    //获取区县//            val street = location?.street ?: ""   //获取街道信息//                       location?.getLocationDescribe()    // 获取位置描述信息// 这里可以获取经(long)纬度(lat)等信息 location?.latitude  location?.logitude//        }        val option = LocationClientOption()        //可选,是否需要地址信息,默认为不需要,即参数为false        //如果开发者需要获得当前点的地址信息,此处必须为true        option.setIsNeedAddress(true)        option.isOpenGps = true // 打开gps        option.setCoorType("bd09ll") // 设置坐标类型        // 定位的频率,每三秒钟定位一次,如果不需要重复定位,可在定位回调监听中调用 mLocationClient?.stop()         option.setScanSpan(3000)        mLocationClient?.locOption = option;        mLocationClient?.start()    }// 记得要页面销毁时调用 mLocationClient 的 stop()方法释放资源
  • 配置 SDK 参数
option.setLocationMode(LocationMode.Hight_Accuracy);//可选,设置定位模式,默认高精度//LocationMode.Hight_Accuracy:高精度;//LocationMode. Battery_Saving:低功耗;//LocationMode. Device_Sensors:仅使用设备;option.setCoorType("bd09ll");//可选,设置返回经纬度坐标类型,默认gcj02//gcj02:国测局坐标;//bd09ll:百度经纬度坐标;//bd09:百度墨卡托坐标;//海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标option.setScanSpan(1000);//可选,设置发起定位请求的间隔,int类型,单位ms//如果设置为0,则代表单次定位,即仅定位一次,默认为0//如果设置非0,需设置1000ms以上才有效option.setOpenGps(true);//可选,设置是否使用gps,默认false//使用高精度和仅用设备两种定位模式的,参数必须设置为trueoption.setLocationNotify(true);//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认falseoption.setIgnoreKillProcess(false);//可选,定位SDK内部是一个service,并放到了独立进程。//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)option.setIgnoreCacheException(false);//可选,设置是否收集Crash信息,默认收集,即参数为falseoption.setWifiValidTime(5*60*1000);//可选,7.2版本新增能力//如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位option.setEnableSimulateGps(false);//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
  • 显示地图图层
    布局文件:
<com.baidu.mapapi.map.TextureMapView        android:id="@+id/common_map"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clickable="true"

这里如果直接使用 BaiduMap 的话, 可能会出现闪屏问题。

页面中初始化:

 common_map.map.isMyLocationEnabled = true // 设置图标显示 common_map.map.setMyLocationConfiguration(MyLocationConfiguration(                MyLocationConfiguration.LocationMode.NORMAL, false, null))
  • * MyLocationConfiguration 的参数:*

参数 1 :是图层显示模式有三种选择:

MyLocationConfiguration.LocationMode.COMPASS 罗盘模式MyLocationConfiguration.LocationMode.FOLLOWING 跟随模式MyLocationConfiguration.LocationMode.NORMAL 默认模式

参数 2 是一个 布尔类型 ,控制是否显示方向,这里是 false 默认在地图显示的是一个 蓝色圆点,设置 true 的话,会带有一个方向箭头 。

参数 3 用来设置显示图标的,如果需要自定义当前位置显示的图标,可以通过此参数来修改。

  • 显示当前位置在地图上:
    这里整理了两种方式,:
    1,需要通过一个 boolean 值进行标识,否则移动一点地图,就会立马归为当前位置。如下代码:isFrist 内部执行完之后,需要设置 isFirst = false .
/**     * 定位到指定位置     */    fun locateTarget(map: BaiduMap, lat: String, long: String, isFirst: Boolean) {        map.setMyLocationData(MyLocationData.Builder().latitude(lat.toDouble()).longitude(long.toDouble()).build())        val ll = LatLng(lat.toDouble(),                long.toDouble())        val builder = MapStatus.Builder()        if (isFirst) {            //第一次直接缩放到当前位置,如果没有判断,则拖动地图之后会自动归为当前 LatLng 所标记地点。//            isFirst = false            builder.target(ll).zoom(18.0f)        }        builder.overlook(0f)        map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()))    }

2,直接定位到当前位置,

// 初次直接使用此方法定位,需要设置此段代码标明是我的位置。map.setMyLocationData(MyLocationData.Builder().latitude(latitude).longitude(longitude).build())val ll = LatLng(latitude, longitude)val mapStatus = MapStatusUpdateFactory.newLatLngZoom(ll, 18f)BaiduMap.setMapStatus(mapStatus)

以上两种方式中的数字 18 表示放大倍数。可以根据自己需要调试一下。

  • 地图描点(可在子线程中执行)
private var marker: BitmapDescriptor? = null    /**     * 设置描点     */    fun setMarker(map: BaiduMap, lat: String?, long: String?): Boolean {        if (marker == null) {            marker = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding)        }        if (!TextUtils.isEmpty(lat) && !TextUtils.isEmpty(long)) {            val latLng = LatLng(lat!!.toDouble(), long!!.toDouble())            val ooA = MarkerOptions().position(latLng).icon(marker)                    .zIndex(9).draggable(true)            map.addOverlay(ooA)            return true        }        return false    }

注意:界面销毁是要记得 调用 marker.recycle() 方法释放资源。

目前就整理这么多,未完待续~

END