阅读(63)
赞(11)
百度智能小程序 获取当前的地理位置和速度
2020-08-18 15:57:45 更新
swan.getLocation
在工具和真机中的实现有区别,详见 API 实现差异。
解释: 获取当前的地理位置、速度。当用户离开智能小程序后,此接口无法调用。使用该 API 需通过获取用户授权设置申请授权后方可对用户发起授权申请,使用 permission 对获取位置信息的用途进行说明,可在 swan.authorize 中查看相关错误码信息。
方法参数
Object object
object 参数说明
属性名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
type | String | 否 | wgs84 | 返回 gps 坐标,可选 gcj02 。 wgs84 返回 gps 坐标, gcj02 返回火星坐标, gcj02 比 wgs84 更为精确,所以返回可用于传入 swan.openLocation 的坐标 |
altitude | Boolean | 否 | 传入 true 会返回高度信息,获取高度需要较高精度且需要打开 gps ,会很耗时,默认没有用 gps | |
success | Function | 否 | 接口调用成功的回调函数,返回内容详见返回参数说明 | |
fail | Function | 否 | 接口调用失败的回调函数 | |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
success 返回参数说明
参数 | 参数类型 | 说明 |
---|---|---|
latitude | Number | 纬度,浮点数,范围为 -90~90 ,负数表示南纬 |
longitude | Number | 经度,浮点数,范围为 -180~180 ,负数表示西经 |
speed | Number | 速度,浮点数,单位 m/s |
accuracy | Number | 位置的精确度 |
altitude | Number | 高度,单位 m |
verticalAccuracy | Number | 垂直精度,单位 m(Android 无法获取,返回 0) |
horizontalAccuracy | Number | 水平精度,单位 m |
street | String | 街道名称 |
cityCode | String | 城市编码,更新的行政区域信息数据请参考行政区域数据更新映射关系表 |
city | String | 城市名称 |
country | String | 国家 |
countryCode | String | 国家代码 |
province | String | 省份 |
streetNumber | String | 街道号码 |
district | String | 区 |
示例
图片示例
代码示例
<view class="wrap">
<view class="card-area">
<view class="list-area border-bottom" s-for="item in infoList">
<view class="list-item-key-4">{{item.chineseName}}}</view>
<view class="list-item-value">{{item.value}}</view>
</view>
</view>
<view class="swan-security-padding-bottom flex-button">
<button type="primary" bindtap="getLocation">点击获取位置信息</button>
</view>
</view>
Page({
data: {
infoList: [{
chineseName: '精确度',
engName: 'accuracy',
value: ''
}, {
chineseName: '高度',
engName: 'altitude',
value: ''
}, {
chineseName: '城市名称',
engName: 'city',
value: ''
}, {
chineseName: '城市编码',
engName: 'cityCode',
value: ''
}, {
chineseName: '国家',
engName: 'country',
value: ''
}, {
chineseName: '国家代码',
engName: 'countryCode',
value: ''
}, {
chineseName: '区',
engName: 'district',
value: ''
}, {
chineseName: '水平精度',
engName: 'horizontalAccuracy',
value: ''
}, {
chineseName: '纬度',
engName: 'latitude',
value: ''
}, {
chineseName: '经度',
engName: 'longitude',
value: ''
}, {
chineseName: '省份',
engName: 'province',
value: ''
}, {
chineseName: '速度',
engName: 'speed',
value: ''
}, {
chineseName: '街道名称',
engName: 'street',
value: ''
}, {
chineseName: '街道号码',
engName: 'streetNumber',
value: ''
}, {
chineseName: '垂直精度',
engName: 'verticalAccuracy',
value: ''
}]
},
onShow() {
let infoList = this.getData('infoList');
for (var i = 0; i < infoList.length; i++) {
infoList[i].value = '';
}
this.setData({
infoList
});
},
getLocation(e) {
swan.getLocation({
type: 'gcj02',
altitude: true,
success: res => {
console.log('getLocation success', res);
let infoList = this.getData('infoList');
for (var i = 0; i < infoList.length; i++) {
const engName = infoList[i].engName;
console.log('engName', res[engName]);
if (res[engName] === '' || res[engName] === 0 || res[engName] === '0') {
infoList[i].value = '暂无';
}
else {
engName === 'latitude' || engName === 'longitude'
? infoList[i].value = this.formatLocation(res[engName]) + '′'
: infoList[i].value = res[engName];
}
}
this.setData({
infoList
});
},
fail: err => {
swan.showToast({
title: '获取失败,请检查位置授权是否开启',
icon: 'none'
});
}
});
},
formatLocation(data) {
return data.toFixed(2).replace('.', '°');
}
});
参考示例
图片示例
同一位置下 type 属性为 wgs84 :
同一位置下 type 属性为 gcj02 :
参考示例:图示可知 type 属性为 gcj02 的位置更为精准,建议与 swan.openLocation 连用验证
Page({
getLocation() {
swan.getLocation({
type: 'gcj02',
altitude: true,
success: res => {
console.log('success', res);
swan.openLocation({
latitude: res.latitude,
longitude: res.longitude,
success: res => {
console.log('openLocation success', res);
},
fail: err => {
console.log('openLocation fail', err);
}
});
},
fail: err => {
swan.showToast({title: '获取失败'});
}
});
},
});