一、地理位置授权实现
1. 前端授权流程
- 触发授权:在用户首次进入配送页面时,调用`wx.getLocation`前需通过`wx.authorize`请求权限。
```javascript
wx.authorize({
scope: scope.userLocation,
success() {
// 用户已授权,获取位置
wx.getLocation({
type: gcj02, // 微信地图兼容坐标系
success(res) {
const { latitude, longitude } = res;
// 调用后端接口保存位置或直接计算配送范围
}
});
},
fail() {
// 引导用户手动授权
wx.showModal({
title: 位置服务未开启,
content: 需要获取您的位置以提供精准配送服务,
success(modalRes) {
if (modalRes.confirm) {
wx.openSetting({
success(settingRes) {
if (settingRes.authSetting[scope.userLocation]) {
// 用户重新授权后重试
}
}
});
}
}
});
}
});
```
- 备用方案:若用户拒绝授权,提供手动输入地址的入口,通过关键词搜索(如调用腾讯地图的`wx.chooseLocation`)获取坐标。
2. 后端存储位置
- 将用户授权的经纬度(`latitude, longitude`)与用户ID关联存储至数据库,用于后续配送范围校验和路线规划。
二、万象(腾讯地图)源码部署
1. 服务端集成
- 申请Key:在腾讯位置服务控制台创建项目,获取WebService API和JS SDK的Key。
- 逆地址解析:将用户经纬度转换为详细地址(用于订单显示)。
```javascript
// 示例:调用腾讯地图逆地址解析API
const axios = require(axios);
const getAddress = async (lat, lng) => {
const res = await axios.get(https://apis.map.qq.com/ws/geocoder/v1/, {
params: {
location: `${lat},${lng}`,
key: YOUR_TENCENT_MAP_KEY,
get_poi: 1 // 可选:返回周边POI信息
}
});
return res.data.result.address;
};
```
2. 配送范围校验
- 多边形判断:使用腾讯地图的`poly`工具判断用户位置是否在配送区域内。
```javascript
// 假设配送区域为多边形顶点数组
const deliveryArea = [[39.9,116.3], [39.9,116.4], ...];
const isInArea = (point, polygon) => {
// 实现射线法判断点是否在多边形内
// 可使用turf.js等库简化计算
};
```
3. 路线规划
- 调用腾讯地图的`direction` API规划骑手到用户地址的最优路径。
```javascript
const getRoute = async (origin, destination) => {
const res = await axios.get(https://apis.map.qq.com/ws/direction/v1/driving/, {
params: {
from: origin.join(,),
to: destination.join(,),
key: YOUR_TENCENT_MAP_KEY
}
});
return res.data.result.routes[0];
};
```
三、精准配送系统设计
1. 动态配送费计算
- 根据距离、时段(高峰/平峰)、天气等因素动态调整配送费。
```javascript
// 示例:基础费+距离费
const calculateFee = (distance) => {
const baseFee = 5;
const perKmFee = distance > 3 ? 2 : 1.5; // 超过3km加价
return baseFee + Math.ceil(distance) * perKmFee;
};
```
2. 骑手分配算法
- 贪心算法:优先分配距离最近的空闲骑手。
- 考虑因素:骑手当前订单数、预计到达时间(ETA)、用户评分等。
3. 实时追踪
- 使用WebSocket或长轮询更新骑手位置,前端通过`