基于不同定价规则的配送距离计算方案咨询
配送分段距离定价实现方案(结合Google API)
核心依赖的Google API
- Directions API:替代你之前用的Distance Matrix API,用于获取路线的完整路径点序列(而非仅总距离),是分段计价的基础。
- Maps JavaScript API:提供多边形空间判断、路径解码、距离计算的工具函数,用于区分区域内/外的距离并统计。
结合Google Earth多边形的操作步骤
- 导出区域多边形:在Google Earth中绘制好自定义本地区域后,将其导出为KML格式文件。
- 解析KML坐标:从KML文件的
<coordinates>标签中提取经纬度数据,转换为Google Maps支持的LatLng坐标数组,以此构建google.maps.Polygon对象。
完整计算流程
- 获取路线路径:调用Directions API请求起点到终点的配送路线,确保返回结果包含
overview_polyline(或各leg的polyline,后者更精确)字段。 - 解码路径点:使用
google.maps.geometry.encoding.decodePath()方法,将API返回的编码polyline转换为包含所有途经点的LatLng数组。 - 分段统计距离:
- 遍历路径点数组,用
google.maps.geometry.spherical.computeDistanceBetween()计算相邻两点间的线段距离(单位为米)。 - 取每条线段的中点,通过
google.maps.geometry.poly.containsLocation()判断该中点是否在自定义多边形内:- 若在区域内,将线段距离累加到本地区域距离;
- 若在区域外,累加到外部区域距离。
- 遍历路径点数组,用
- 计算最终价格:将米转换为千米后,用
本地区域距离 * X + 外部区域距离 * Y得到总价。
示例代码(JavaScript)
// 1. 从Google Earth KML提取并转换的本地区域坐标 const localAreaCoords = [ { lat: 37.7749, lng: -122.4194 }, { lat: 37.7680, lng: -122.4194 }, { lat: 37.7680, lng: -122.4080 }, { lat: 37.7749, lng: -122.4080 } ]; const localPolygon = new google.maps.Polygon({ paths: localAreaCoords }); // 2. 初始化Directions服务 const directionsService = new google.maps.DirectionsService(); // 3. 请求路线并计算分段距离 directionsService.route({ origin: "San Francisco, CA", destination: "Oakland, CA", travelMode: google.maps.TravelMode.DRIVING }, (response, status) => { if (status === "OK") { const route = response.routes[0]; // 解码路线的完整路径点 const pathPoints = google.maps.geometry.encoding.decodePath(route.overview_polyline.points); let localDistMeters = 0; let externalDistMeters = 0; // 遍历路径线段 for (let i = 0; i < pathPoints.length - 1; i++) { const pointA = pathPoints[i]; const pointB = pathPoints[i + 1]; // 计算当前线段的距离(米) const segmentDist = google.maps.geometry.spherical.computeDistanceBetween(pointA, pointB); // 取线段中点判断区域归属 const midPoint = new google.maps.LatLng( (pointA.lat() + pointB.lat()) / 2, (pointA.lng() + pointB.lng()) / 2 ); if (google.maps.geometry.poly.containsLocation(midPoint, localPolygon)) { localDistMeters += segmentDist; } else { externalDistMeters += segmentDist; } } // 转换为千米并计算总价 const localDistKm = localDistMeters / 1000; const externalDistKm = externalDistMeters / 1000; const X = 2; // 本地区域单价(元/km) const Y = 3; // 外部区域单价(元/km) const totalPrice = (localDistKm * X) + (externalDistKm * Y); console.log(`区域内距离:${localDistKm.toFixed(2)}km,区域外距离:${externalDistKm.toFixed(2)}km`); console.log(`总配送价:${totalPrice.toFixed(2)}元`); } else { console.error(`路线请求失败:${status}`); } });
注意事项
- 若路线包含多个停靠点(多leg),需遍历每个leg的
path字段,而非仅使用overview_polyline,以保证距离统计的精确性。 - Google Earth导出的KML默认采用WGS84经纬度格式,可直接解析使用。
- 需注意Google API的调用配额与计费规则,避免超出限额。
内容的提问来源于stack exchange,提问作者orzumurod parmonov
相关产品推荐
相关产品推荐

