最近因为公司需求,要做这么一个东西,大体就是小程序只能在公司内使用,于是开始研究uniapp的api,基本使用看上一篇文章
注意看type这个属性,我们应使用默认参数,后边讲为什么
我是通过
这个方法手动获取公司的经纬度,然后保存下来把这个api删掉了,注意吼,这个api获取的经纬度是国测局坐标,但是上方获取用户位置的api是gps坐标,两者需要转一下,先说为什么第一个api不使用国测局坐标,因为通过Haversine公式计算得到的结果与实际误差500多米hhhh,我就在公司显示我距离公司还有500多米,我踏马人傻掉啦
我们只需要将国测局坐标转为gps坐标即可
const gps = require("coordtransform");
const gpsTowg = gps.gcj02towgs84(117.20807,36.17348);
const gpsLon = gpsTowg[0];
const gpsLat = gpsTowg[1];
使用这个js库可以轻松解决
uni.authorize({
scope: "scope.userLocation",
success() {
uni.getLocation({
isHighAccuracy: true, //开启高精度定位
success(res) {
//纬度 精度 速度 位置的精确度 高度 垂直精度 水平精度
const {
latitude,
longitude,
} = res;
const radius = 500; //m
function calculateDistance(lat1, lon1, lat2, lon2) {
const R = 6371e3; // 地球半径(米)
const a1 = lat1 * Math.PI / 180; // 第一个点的纬度转换为弧度
const a2 = lat2 * Math.PI / 180; // 第二个点的纬度转换为弧度
const a3 = (lat2 - lat1) * Math.PI / 180; // 纬度之差的弧度值
const a4 = (lon2 - lon1) * Math.PI / 180; // 经度之差的弧度值
const a = Math.sin(a3 / 2) * Math.sin(a3 / 2) +
Math.cos(a1) * Math.cos(a2) *
Math.sin(a4 / 2) * Math.sin(a4 / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c; // 计算球面距离
return distance;
}
const distance = calculateDistance(latitude, longitude, 36.17338580135579,
117.20212702405742);
if (distance <= radius) {
console.log('用户在区域内');
} else {
console.log('用户不在区域内');
}
},
fail(err) {
console.log(err);
}
})
}
})
首先通过authorize请求权限,需要进行配置,可以看上一篇文章,然后通过getLocation获取用户位置,radius是公司的有效范围,calculateDistance是计算公式,返回值是用户所在的位置距离公司的距离,然后判断是否在范围内即可
搞了一下午加一早上终于解决,主要坑就是国测局那一块,误差竟然有500多米也是离谱了