为帮助用户更好更快的使用原生插件,论坛维护了一个示例,示例中包含示例代码、知识点讲解、注意事项等,供您参考。
bmLocation 封装了百度地图定位的 SDK,是 baiduLocation 原生插件的优化升级版。百度地图移动端定位SDK,是百度地图开放平台面向广大移动应用开发者全新推出的一款定位服务产品。开发者在自己的移动应用中集成定位SDK,可轻松实现获取当前位置信息的功能。
百度地图定位SDK以系统定位能力为基础,在此基础之上,面向广大开发者提供了更多丰富功能,包括:地址解析、位置描述、移动热点识别、地理围栏、国内外位置判断等功能。
百度地图定位SDK免费对外开放,接口使用无次数限制。您在使用前,需先申请密钥(AK)才可使用。
在您使用百度地图定位SDK之前,请先阅读并同意百度地图开放平台服务条款中的各项内容
开发者使用本原生插件之前需先去百度地图开放平台申请开发者账号,创建自己的 APP 从而获取 ak,本原生插件所需的 ak 与 baiduMap 原生插件、bMap 原生插件所需的密钥可以相同。
使用此原生插件之前 iOS 必须先配置 config 文件,配置方法如下:
<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"/>
注意:后台定位功能的缺点是耗电量大
目前国内主要有以下三种坐标系:
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系;
GCJ02:表示经过国测局加密的坐标;
BD09:为百度坐标系,其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标;
iOS定位SDK产品,支持全球定位,能够精准的获取经纬度信息。根据开发者的设置,在国内获得的坐标系类型可以是:国测局坐标、百度墨卡托坐标 和 百度经纬度坐标。在海外地区,只能获得WGS84坐标。请开发者在使用过程中注意坐标选择。
iOS定位SDK产品中,还提供了坐标转换的能力,坐标转换规则如下:
- WGS84可转换为:百度经纬度坐标、百度墨卡托坐标;
- 国测局坐标 可转换为:百度经纬度坐标、百度墨卡托坐标;
- 百度经纬度坐标 可转换为:百度墨卡托坐标;
- 百度墨卡托坐标 可转换为:百度经纬度坐标;
不能同时添加的原生插件:baiduNavigation, baiduPanorama
隐私合规接口
自原生插件 1.2.0后请务必同意该接口,否则该原生插件将不能正常使用,隐私政策可参考百度地图官网
setAgreePrivacy(callback(ret, err))
var bmLocation = api.require('bmLocation');
bmLocation.setAgreePrivacy({
agree:true
});
Android系统
可提供的1.2.0及更高版本
获取授权验证码
getPermissionState(callback(ret))
ret:
{
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({params})
coordinateType:
filter:
accuracy:
activityType:
locationTimeout:
reGeocodeTimeout:
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及更高版本
单次定位。如果当前正在连续定位,调用此方法将会失败.
该方法将会根据设定的 accuracy (configManager接口)去获取定位信息。如果获取的定位信息精确度低于 accuracy ,将会持续的等待定位信息,直到超时后返回精度最高的定位信息。可以通过 stopLocation 方法去取消正在进行的单次定位请求。
singleLocation(callback(ret))
reGeocode:
netWorkState:
ret:
{
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()
var bmLocation = api.require('bmLocation');
bmLocation.stopLocation();
iOS系统,Android系统
可提供的1.0.0及更高版本
开始连续定位
start(callback(ret))
locatingWithReGeocode:
backgroundLocation:
enableLocInForeground:
notification:
内部字段:
{
id : 1, //(必选项) 数字类型;为通知栏notifation设置唯一id,必须大于0
contentTitle : //(必选项) 字符串类型;标题
contentText: //(必选项) 字符串类型;内容
}
ret:
{
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及更高版本
经纬度坐标转换
注意:百度经纬度坐标BMK09LL转国测局坐标GCJ02,百度墨卡托坐标BMK09MC转百度经纬度坐标BMK09LL接口
trans({params},callback(ret))
srcType:
desType:
latitude:
longitude:
ret:
{
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({params},callback(ret))
coordinateType:
latitude:
longitude:
ret:
{
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及更高版本
是否开启GPS定位服务(暂仅支持Android)
isGPSEnable(callback(ret))
ret:
{
enable: true //布尔类型;是否使能GPS,true|false
}
var bmLocation = api.require('bmLocation');
bmLocation.isGPSEnable(function(ret) {
api.alert({
msg: JSON.stringify(ret)
})
});
Android系统
可提供的1.0.0及更高版本