一、前端地理位置授权流程
1. 微信小程序授权
```javascript
// 页面加载时检查授权状态
Page({
onLoad() {
wx.getSetting({
success(res) {
if (!res.authSetting[scope.userLocation]) {
wx.authorize({
scope: scope.userLocation,
success() {
this.getLocation();
},
fail() {
// 引导用户手动授权
wx.showModal({
title: 位置服务未开启,
content: 需要获取您的位置以提供精准配送服务,
success(modalRes) {
if (modalRes.confirm) {
wx.openSetting();
}
}
});
}
});
} else {
this.getLocation();
}
}
});
},
getLocation() {
wx.getLocation({
type: gcj02, // 微信坐标系
success(res) {
const { latitude, longitude } = res;
// 调用后端接口解析地址
wx.request({
url: https://your-api.com/address/parse,
method: POST,
data: { lat: latitude, lng: longitude },
success(apiRes) {
// 更新页面地址显示
this.setData({ userAddress: apiRes.data.address });
}
});
}
});
}
});
```
2. 关键配置项
- 在`app.json`中声明权限:
```json
{
"permission": {
"scope.userLocation": {
"desc": "您的位置将用于生鲜配送路线规划"
}
}
}
```
二、后端地址解析与配送优化
1. 坐标系转换(WGS84→GCJ02)
若使用第三方地图API(如高德/腾讯),需先转换坐标系:
```javascript
// 示例:使用coordtransform库
const coordtransform = require(coordtransform);
// WGS84(GPS)转GCJ02(火星坐标)
const [lng, lat] = coordtransform.wgs84togcj02(116.3, 39.9);
```
2. 地址反解析(腾讯地图API示例)
```javascript
const axios = require(axios);
async function parseAddress(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
}
});
return res.data.result.address;
}
```
3. 万象源码配送逻辑集成
假设万象源码提供配送范围校验接口:
```javascript
// 校验用户地址是否在配送范围内
async function checkDeliveryRange(address) {
const res = await axios.post(https://your-wanxiang-api.com/delivery/check, {
address,
businessId: YOUR_STORE_ID
});
return res.data.isInRange;
}
// 计算配送费(基于距离)
async function calculateFee(startLng, startLat, endLng, endLat) {
const distance = getDistance(startLng, startLat, endLng, endLat); // 自定义距离计算函数
return Math.max(5, Math.floor(distance / 1000) * 2); // 基础费5元,每公里+2元
}
```
三、精准配送实现要点
1. 动态配送范围:
- 基于骑手实时位置/仓库位置动态计算可配送区域
- 使用GeoJSON格式定义多边形配送范围
2. 路径规划优化:
```javascript
// 调用高德路径规划API
async function getRoute(origin, destination) {
const res = await axios.get(https://restapi.amap.com/v3/direction/driving, {
params: {
origin: `${origin.lat},${origin.lng}`,
destination: `${destination.lat},${destination.lng}`,
key: YOUR_AMAP_KEY
}
});
return res.data.route.paths[0].distance;
}
```
3. 实时位置追踪:
- 使用WebSocket推送骑手位置
- 前端通过`