bmLocation

论坛示例

为帮助用户更好更快的使用原生插件,论坛维护了一个示例,示例中包含示例代码、知识点讲解、注意事项等,供您参考。

概述

bmLocation 封装了百度地图定位的 SDK,是 baiduLocation 原生插件的优化升级版。百度地图移动端定位SDK,是百度地图开放平台面向广大移动应用开发者全新推出的一款定位服务产品。开发者在自己的移动应用中集成定位SDK,可轻松实现获取当前位置信息的功能。

百度地图定位SDK以系统定位能力为基础,在此基础之上,面向广大开发者提供了更多丰富功能,包括:地址解析、位置描述、移动热点识别、地理围栏、国内外位置判断等功能。

百度地图定位SDK免费对外开放,接口使用无次数限制。您在使用前,需先申请密钥(AK)才可使用。

在您使用百度地图定位SDK之前,请先阅读并同意百度地图开放平台服务条款中的各项内容

开发者使用本原生插件之前需先去百度地图开放平台申请开发者账号,创建自己的 APP 从而获取 ak,本原生插件所需的 ak 与 baiduMap 原生插件、bMap 原生插件所需的密钥可以相同。

使用此原生插件之前 iOS 必须先配置 config 文件,配置方法如下:

  • 名称:bmLocation
  • 参数:apiKey
  • 配置示例:
  <feature name="bmLocation">
    <param name="ios_api_key" value="81qz3dBYB5q2nGji4IYrawr1" />
  </feature>
  • 字段描述:

    apiKey:在百度地图开放平台申请的 ak

使用此原生插件之前 android 必须先配置 config 文件,配置方法如下:

  • 配置示例:
 <meta-data  name="com.baidu.lbsapi.API_KEY"  value="您的百度ak" />
  • 字段描述:

    apiKey:在百度地图开放平台申请的 ak

后台定位功能:

本原生插件支持后台定位功能。由于系统限制,在 iOS 和 android 平台上表现有所不同。在 iOS 平台上,定位功能必须在 app 为当前激活使用状态,或者后台运行状态时。若将 app 从后台杀死,则本 app 的所有功能都被关闭,包括后台定位功能。若要集成后台定位功能,必须得配置 config 文件,然后云编译或自定义 loader 方可。配置实例如下:

//配置一个后台定位功能:
<preference name="backgroundMode" value="location"/>

//配置多个后台运行功能,各值之间用竖线 | 隔开:
<preference name="backgroundMode" value="location | audio"/>

注意:后台定位功能的缺点是耗电量大

地图坐标系

目前国内主要有以下三种坐标系:

  1. WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系;

  2. GCJ02:表示经过国测局加密的坐标;

  3. BD09:为百度坐标系,其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标;

iOS定位SDK产品,支持全球定位,能够精准的获取经纬度信息。根据开发者的设置,在国内获得的坐标系类型可以是:国测局坐标、百度墨卡托坐标 和 百度经纬度坐标。在海外地区,只能获得WGS84坐标。请开发者在使用过程中注意坐标选择。

iOS定位SDK产品中,还提供了坐标转换的能力,坐标转换规则如下:

- WGS84可转换为:百度经纬度坐标、百度墨卡托坐标;

- 国测局坐标 可转换为:百度经纬度坐标、百度墨卡托坐标;

- 百度经纬度坐标 可转换为:百度墨卡托坐标;

- 百度墨卡托坐标 可转换为:百度经纬度坐标;

不能同时添加的原生插件:baiduNavigation, baiduPanorama

注意事项:

  • 1、Android从1.0.2版本开始,需用升级环境编译

原生插件接口

setAgreePrivacy

隐私合规接口

自原生插件 1.2.0后请务必同意该接口,否则该原生插件将不能正常使用,隐私政策可参考百度地图官网

setAgreePrivacy(callback(ret, err))

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.setAgreePrivacy({
  agree:true
});

可用性

Android系统

可提供的1.2.0及更高版本

getPermissionState

获取授权验证码

getPermissionState(callback(ret))

callback(ret)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
    code: 0   //数字类型;授权验证码,取值范围如下:
              //-1:未知错误
              //0:鉴权成功
              //1:因网络鉴权失败
              //2: ak非法鉴权失败
}

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.getPermissionState(function(ret) {
    var sta = ret.code;
});

可用性

iOS系统

可提供的1.0.0及更高版本

configManager

配置定位参数

configManager({params})

params

coordinateType:

  • 类型:字符串
  • 描述:(可选项)坐标系类型
  • 默认:GCJ02
  • 取值范围:
    • BMK09LL:百度经纬度坐标
    • BMK09MC:百度墨卡托米制坐标
    • WGS84:大地坐标系,目前广泛使用的GPS全球卫星定位系统使用的坐标系;(android不支持)
    • GCJ02:经过国测局加密的坐标;

filter:

  • 类型:数字
  • 描述:(可选项)位置更新所需最小距离(单位米)(android不支持)
  • 默认值:1.0

accuracy:

  • 类型:字符串
  • 描述:(可选项)定位精度,信号不稳定时,定位精度过高,在 iOS 平台上会偶现定位失败的问题
  • 默认值:device_sensors
  • 取值范围:
    • battery_saving:低功耗模式
    • device_sensors:仅设备(Gps)模式
    • hight_accuracy:高精度模式

activityType:

  • 类型:字符串
  • 描述:(可选项)定位类型 (android不支持)
  • 默认值:automotiveNavigation
  • 取值范围:
    • other:其它
    • automotiveNavigation:for automotive navigation
    • fitness:includes any pedestrian activities
    • otherNavigation:for other navigation cases (excluding pedestrian navigation), e.g. navigation for boats, trains, or planes

locationTimeout:

  • 类型:数字
  • 描述:(可选项)单次定位超时时间,单位秒(s)。最小值是2s
  • 默认值:10

reGeocodeTimeout:

  • 类型:数字
  • 描述:(可选项)单次定位逆地理超时时间,单位秒(s)。最小值是2s (android不支持)
  • 默认值:10

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.configManager({
    accuracy: 'device_sensors',
    filter: 1,
    activityType:'automotiveNavigation',
    coordinateType:'GCJ02',
    locationTimeout: 10,
    reGeocodeTimeout: 10
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

singleLocation

单次定位。如果当前正在连续定位,调用此方法将会失败.

该方法将会根据设定的 accuracy (configManager接口)去获取定位信息。如果获取的定位信息精确度低于 accuracy ,将会持续的等待定位信息,直到超时后返回精度最高的定位信息。可以通过 stopLocation 方法去取消正在进行的单次定位请求。

singleLocation(callback(ret))

params

reGeocode:

  • 类型:布尔
  • 描述:(可选项)是否带有逆地理信息(获取逆地理信息需要联网)(android获取到的结果会自行转化,不需要设置)
  • 默认:false

netWorkState:

  • 类型:布尔
  • 描述:(可选项)是否带有移动热点识别状态(需要联网)(android不支持)
  • 默认值:false

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
    status: true,                //布尔类型;操作成功状态值,true|false
    location: {                  //JSON对象;位置信息
        longitude: 116.213,       //数字类型;经度
        latitude: 39.213,         //数字类型;纬度
        altitude:  ,              //数字类型;海拔
        horizontalAccuracy: ,     //数字类型;水平值,若不支持则为负数(android不支持)
        verticalAccuracy: ,       //数字类型;垂直值,若不支持则为负数(android不支持)
        course:,                  //数字类型;角度,正北方为0度,0-359.9,若不支持则为负数(android不支持)
        speed:,                   //数字类型;速度m/s,若不支持则为负数
        floor:,                   //数字类型;楼层,支持室内地图时有值,否则为undefined
        timestamp:                //数字类型;时间戳
    },
    provider: '',                //字符串类型;位置来源iOS、other(android不支持)
    locationID:'',               //字符串类型;位置ID
    networkState:'',             //字符串类型;网络状态
                                 //0:未知   没有获取到定位结果采用的类型
                                 //1:wifi  wifi定位结果
                                 //2:WIFI移动热点(android不支持)
                                 //3:移动2G(android不支持)
                                 //4:移动3G(android不支持)
                                 //5:移动4G(android不支持)
                                 //6:基站定位结果(ios不支持)
                                 //7:gps定位结果(ios不支持)
    reGeo: {                     //JSON对象;地址数据
        country:'',              //字符串类型;国家名字属性
        countryCode:'',          //字符串类型;国家编码属性
        province:'',             //字符串类型;省份名字属性
        city:'',                 //字符串类型;城市名字属性
        district:'',             //字符串类型;区名字属性
        street:'',               //字符串类型;街道名字属性
        streetNumber:'',         //字符串类型;街道号码属性
        cityCode:'',             //字符串类型;城市编码属性
        adCode:'',               //字符串类型;行政区划编码属性
        locationDescribe:'',     //字符串类型;周围的描述信息
        poiList:[{               //数组类型;定位点周围的poi列表信息
            uid: '',             //字符串类型;
            name: '',            //字符串类型;
            relaiability:        //数字类型;
        }]     
    }
}

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.singleLocation({
    reGeocode: false,
    netWorkState: false
}, function(ret) {
    var sta = ret.status;
    if (sta) {
        var lat = ret.location.latitude;
        var lon = ret.location.longitude;
        var t = ret.timestamp;
        var str = '经度:' + lon + '<br>';
        str += '纬度:' + lat + '<br>';
        str += '更新时间:' + t + '<br>';
        api.alert({ msg: str });
    } else {
        api.alert({ msg: '发生错误' });
    }
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

stopLocation

停止定位,连续定位和单次定位都会被停止

stopLocation()

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.stopLocation();

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

start

开始连续定位

start(callback(ret))

params

locatingWithReGeocode:

  • 类型:布尔
  • 描述:(可选项)是否返回逆地理信息(android获取到的结果会自行转化,不需要设置)
  • 默认:true

backgroundLocation:

  • 类型:布尔
  • 描述:(可选项)是否允许后台连续定位,注意申请后台定位权限(android不支持)
  • 默认值:false

enableLocInForeground:

  • 类型:布尔类型
  • 描述:(可选项) 开发者应用如果有后台定位需求,在退到后台的时候,为了保证定位可以在后台一直运行,可以设置为true,适配android 8后台无法定位问题,其他版本下也会提高定位进程存活率(ios不支持)
  • 默认值:false

notification:

  • 类型:JSON对象
  • 描述:(必选项) 通知栏的提示,此字段只有在enableLocInForeground设置为true时有效。(百度为了app能够在后台持续定位,就得需要开启一个前台服务,要开启一个前台服务就得开启通知栏提示)(ios不支持)

内部字段:

{
    id : 1,   //(必选项) 数字类型;为通知栏notifation设置唯一id,必须大于0
    contentTitle :  //(必选项) 字符串类型;标题
    contentText:    //(必选项) 字符串类型;内容
}

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
    status: true,                //布尔类型;操作成功状态值,true|false
    location: {                  //JSON对象;位置信息
        longitude: 116.213,       //数字类型;经度
        latitude: 39.213,         //数字类型;纬度
        altitude:  ,              //数字类型;海拔
        horizontalAccuracy: ,     //数字类型;水平值,若不支持则为负数(android不支持)
        verticalAccuracy: ,       //数字类型;垂直值,若不支持则为负数(android不支持)
        course:,                  //数字类型;角度,正北方为0度,0-359.9,若不支持则为负数(android不支持)
        speed:,                   //数字类型;单位:ios:速度m/s; android:km/h,若不支持则为负数
        floor:,                   //数字类型;楼层,支持室内地图时有值,否则为undefined
        timestamp:                //数字类型;时间戳
    },
    provider: '',                //字符串类型;位置来源iOS、other(android不支持)
    locationID:'',               //字符串类型;位置ID
    reGeo: {                     //JSON对象;地址数据
        country:'',              //字符串类型;国家名字属性
        countryCode:'',          //字符串类型;国家编码属性
        province:'',             //字符串类型;省份名字属性
        city:'',                 //字符串类型;城市名字属性
        district:'',             //字符串类型;区名字属性
        street:'',               //字符串类型;街道名字属性
        streetNumber:'',         //字符串类型;街道号码属性
        cityCode:'',             //字符串类型;城市编码属性
        adCode:'',               //字符串类型;行政区划编码属性
        locationDescribe:'',     //字符串类型;周围的描述信息
        poiList:[{               //数组类型;定位点周围的poi列表信息
            uid: '',             //字符串类型;
            name: '',            //字符串类型;
            relaiability:        //数字类型;
        }]     
    }
}

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.start({
    locatingWithReGeocode: true,
    backgroundLocation: false
}, function(ret) {
    var sta = ret.status;
    if (sta) {
        var lat = ret.location.latitude;
        var lon = ret.location.longitude;
        var t = ret.timestamp;
        var str = '经度:' + lon + '<br>';
        str += '纬度:' + lat + '<br>';
        str += '更新时间:' + t + '<br>';
        api.alert({ msg: str });
    } else {
        api.alert({ msg: '发生错误' });
    }
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

trans

经纬度坐标转换

注意:百度经纬度坐标BMK09LL转国测局坐标GCJ02,百度墨卡托坐标BMK09MC转百度经纬度坐标BMK09LL接口

trans({params},callback(ret))

params

srcType:

  • 类型:字符串
  • 描述:(可选项)原坐标系类型
  • 默认:GCJ02
  • 取值范围:
    • BMK09LL:百度经纬度坐标
    • BMK09MC:百度墨卡托米制坐标
    • WGS84:大地坐标系,目前广泛使用的GPS全球卫星定位系统使用的坐标系;
    • GCJ02:经过国测局加密的坐标;

desType:

  • 类型:字符串
  • 描述:(可选项)转换后的坐标系类型
  • 默认:BMK09LL
  • 取值范围:
    • BMK09LL:百度经纬度坐标
    • BMK09MC:百度墨卡托米制坐标
    • WGS84:大地坐标系,目前广泛使用的GPS全球卫星定位系统使用的坐标系;
    • GCJ02:经过国测局加密的坐标;

latitude:

  • 类型:数字
  • 描述:原纬度值

longitude:

  • 类型:数字
  • 描述:原经度值

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
    status: true,                //布尔类型;操作成功状态值,true|false
    location: {                  //JSON对象;位置信息
        longitude: 116.213,       //数字类型;经度
        latitude: 39.213,         //数字类型;纬度
    }
}

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.trans({
    latitude: 116,
    latitude: 39,
    desType:'BMK09LL',
    srcType:'GCJ02'
}, function(ret) {
    var sta = ret.status;
    if (sta) {
        var lat = ret.location.latitude;
        var lon = ret.location.longitude;
        var t = ret.timestamp;
        var str = '经度:' + lon + '<br>';
        str += '纬度:' + lat + '<br>';
        str += '更新时间:' + t + '<br>';
        api.alert({ msg: str });
    } else {
        api.alert({ msg: '发生错误' });
    }
});

可用性

iOS系统

可提供的1.0.0及更高版本

judge

判断经纬度确定的位置是否在中国大陆

judge({params},callback(ret))

params

coordinateType:

  • 类型:字符串
  • 描述:(可选项)坐标系类型
  • 默认:BMK09LL
  • 取值范围:
    • BMK09LL:百度经纬度坐标
    • BMK09MC:百度墨卡托米制坐标
    • WGS84:大地坐标系,目前广泛使用的GPS全球卫星定位系统使用的坐标系;
    • GCJ02:经过国测局加密的坐标;

latitude:

  • 类型:数字
  • 描述:纬度值

longitude:

  • 类型:数字
  • 描述:经度值

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
    status: true     //布尔类型;是否在中国大陆,true|false
}

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.trans({
    latitude: 116,
    latitude: 39,
    coordinateType:'BMK09LL'
}, function(ret) {
    var sta = ret.status;
    if (sta) {
        api.alert({ msg: '在'  });
    } else {
        api.alert({ msg: '不在' });
    }
});

可用性

iOS系统

可提供的1.0.0及更高版本

isGPSEnable

是否开启GPS定位服务(暂仅支持Android)

isGPSEnable(callback(ret))

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
    enable: true     //布尔类型;是否使能GPS,true|false
}

示例代码

var bmLocation = api.require('bmLocation');
bmLocation.isGPSEnable(function(ret) {
    api.alert({
            msg: JSON.stringify(ret)
        })
});

可用性

Android系统

可提供的1.0.0及更高版本

是否仍需要帮助? 请保持联络!
最后更新于 2024/10/10