uniapp微信小程序用geolib库实现门店定位服务

281 阅读1分钟

在前端(即微信小程序门店页面)做实时计算。 微信小程序定位接口获取经纬度,用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);