阅读(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: '获取失败'});
            }
        });
    },
});