You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于不同定价规则的配送距离计算方案咨询

配送分段距离定价实现方案(结合Google API)

核心依赖的Google API

  • Directions API:替代你之前用的Distance Matrix API,用于获取路线的完整路径点序列(而非仅总距离),是分段计价的基础。
  • Maps JavaScript API:提供多边形空间判断、路径解码、距离计算的工具函数,用于区分区域内/外的距离并统计。

结合Google Earth多边形的操作步骤

  1. 导出区域多边形:在Google Earth中绘制好自定义本地区域后,将其导出为KML格式文件。
  2. 解析KML坐标:从KML文件的<coordinates>标签中提取经纬度数据,转换为Google Maps支持的LatLng坐标数组,以此构建google.maps.Polygon对象。

完整计算流程

  1. 获取路线路径:调用Directions API请求起点到终点的配送路线,确保返回结果包含overview_polyline(或各leg的polyline,后者更精确)字段。
  2. 解码路径点:使用google.maps.geometry.encoding.decodePath()方法,将API返回的编码polyline转换为包含所有途经点的LatLng数组。
  3. 分段统计距离:
    • 遍历路径点数组,用google.maps.geometry.spherical.computeDistanceBetween()计算相邻两点间的线段距离(单位为米)。
    • 取每条线段的中点,通过google.maps.geometry.poly.containsLocation()判断该中点是否在自定义多边形内:
      • 若在区域内,将线段距离累加到本地区域距离;
      • 若在区域外,累加到外部区域距离。
  4. 计算最终价格:将米转换为千米后,用本地区域距离 * 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:15:03