在前端(即微信小程序门店页面)做实时计算。 微信小程序定位接口获取经纬度,用geolib库和后端请求下来门店列表里的经纬度做计算和查询。
- manifest.json里添加定位权限
/* 小程序特有相关 */
"mp-weixin" : {
// 加入以下代码
"permission" : {
"scope.userLocation" : {
"desc" : "你的位置信息将用于门店定位服务"
}
},
"requiredPrivateInfos" : [ "getLocation" ]
}
- 获取当前用户所在位置的经纬度,选择gcj02类型是为了在地图map标点使用,详见uniapp文档
uni.authorize({
scope: 'scope.userLocation',
success() {
uni.getLocation({
type: 'gcj02',
isHighAccuracy: true,
success(res) {
console.log('----获取定位成功----', res);
if (res.errMsg == "getLocation:ok") {
// 位置的精确度,反应与真实位置之间的接近程度,可以理解成10即与真实位置相差10m,越小越精确
that.accuracy = res.accuracy;
that.latitude = res.latitude;
that.longitude = res.longitude;
}
},
fail(e) {
console.log('----获取定位失败----', e);
}
})
},
fail(e) {
console.log('----获取定位授权失败----', e);
}
})
- 如果用户关闭了授权可以弹窗提示用户打开,下面这段代码只能用点击事件触发哦。推荐弹窗里面加button点击触发
// 打开微信小程序设置
uni.openSetting({
success(res) {
console.log(res.authSetting)
},
fail(e) {
console.log('----打开小程序设置失败----', e);
}
});
两点之间距离计算&查找半径内的所有点
const geolib = require('geolib');
// 添加位置
const locations = [
{ name: 'Palermo', latitude: 38.115556, longitude: 13.361389 },
{ name: 'Catania', latitude: 37.507877, longitude: 15.083030 }
];
// 计算两个地点的距离
const distance = geolib.getDistance(
{ latitude: 38.115556, longitude: 13.361389 }, // Palermo
{ latitude: 37.507877, longitude: 15.083030 } // Catania
);
// 运行结果:Distance: 165831 meters
console.log(`Distance: ${distance} meters`);
// 查找半径内的所有点
const nearbyLocations = locations.filter(location =>
geolib.isPointWithinRadius(
{ latitude: location.latitude, longitude: location.longitude },
{ latitude: 38.115556, longitude: 13.361389 }, // 参考点
2000 // 半径2公里
)
);
// 运行结果:Nearby locations: [ { name: 'Palermo', latitude: 38.115556, longitude: 13.361389 } ]
console.log('Nearby locations:', nearbyLocations);