一、地理位置授权实现
1. 前端授权流程
```javascript
// 1. 检查授权状态
wx.getSetting({
success(res) {
if (!res.authSetting[scope.userLocation]) {
// 2. 未授权则触发授权弹窗
wx.authorize({
scope: scope.userLocation,
success() {
getUserLocation(); // 授权成功获取位置
},
fail() {
// 3. 用户拒绝授权时显示引导按钮
showLocationGuide();
}
});
} else {
getUserLocation(); // 已授权直接获取位置
}
}
});
// 获取用户位置
function getUserLocation() {
wx.getLocation({
type: gcj02, // 腾讯地图坐标系
success(res) {
const { latitude, longitude } = res;
// 将坐标传给后端或用于地图展示
}
});
}
```
2. 授权引导弹窗
- 用户拒绝授权时,显示自定义弹窗引导至设置页:
```javascript
function showLocationGuide() {
wx.showModal({
title: 位置服务未开启,
content: 需要获取您的位置以提供精准配送服务,
confirmText: 去设置,
success(res) {
if (res.confirm) {
wx.openSetting(); // 跳转小程序设置页
}
}
});
}
```
二、精准配送功能实现
1. 后端服务架构
- 技术栈建议:Node.js + MongoDB(存储商家/配送点数据)
- 核心功能:
- 接收用户坐标(GCJ-02)
- 计算最近配送点(使用地理空间索引)
```javascript
// MongoDB 地理查询示例
db.stores.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [userLng, userLat]
},
$maxDistance: 5000 // 5公里范围内
}
}
});
```
2. 配送时间预估
- 集成腾讯地图路线规划API:
```javascript
// 调用腾讯地图路线规划
const url = `https://apis.map.qq.com/ws/route/1/bicycle/?from=${userLat},${userLng}&to=${storeLat},${storeLng}&key=YOUR_KEY`;
// 解析返回的duration字段作为预估时间
```
3. 万象源码部署要点
- 代码修改:
- 在`app.js`中全局注入位置服务
- 修改订单页面显示配送距离和时间
- 配置文件:
```json
// project.config.json
{
"requiredBackgroundModes": ["location"], // 后台定位权限
"permission": {
"scope.userLocation": {
"desc": "需要获取您的位置以提供精准配送服务"
}
}
}
```
三、优化建议
1. 性能优化
- 使用Web Worker处理地理计算
- 对商家数据建立R-Tree空间索引
2. 用户体验
- 添加"使用当前位置"和"手动选择地址"双模式
- 配送时间显示动态更新(如"约25-35分钟送达")
3. 安全措施
- 坐标数据加密传输
- 定期清理过期位置记录
四、完整流程示例
1. 用户打开小程序 → 触发位置授权
2. 授权成功后获取坐标 → 调用后端接口查询最近门店
3. 显示门店列表(含距离和预估时间)
4. 用户下单时再次验证位置有效性
5. 订单分配给最近配送员并实时更新位置
五、常见问题解决
1. 定位偏差:
- 使用`wx.chooseLocation`让用户手动修正
- 对比GPS、Wi-Fi、基站定位结果
2. 接口限流:
- 腾讯地图免费版QPS限制为5,需申请企业版或做请求缓存
3. 跨平台兼容:
- 使用`