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

如何在Google Maps API中为折线两点间程序化添加x个等距点?

在Google Maps API中为两点折线添加等距中间点

基础线性插值实现

如果两点距离不算特别远,直接用经纬度的线性插值就足够精准。你需要计算经纬度的增量,分步骤生成中间点:

function addEquidistantPoints(path, numPointsToAdd) {
  if (path.length !== 2) return [...path]; // 仅处理两点路径,可扩展为多点路径
  
  const [start, end] = path;
  // 计算每一步的经纬度增量:总差值除以(要添加的点数 + 1),因为要分成numPointsToAdd+1段
  const latIncrement = (end.lat - start.lat) / (numPointsToAdd + 1);
  const lngIncrement = (end.lng - start.lng) / (numPointsToAdd + 1);
  
  const newPath = [start];
  // 循环生成中间点
  for (let i = 1; i <= numPointsToAdd; i++) {
    newPath.push({
      lat: start.lat + latIncrement * i,
      lng: start.lng + lngIncrement * i
    });
  }
  newPath.push(end);
  
  return newPath;
}

// 使用示例
let path = [
    {lat : 35.20806877349178, lng : 38.14744584290822},
    {lat : 35.202442417421985, lng : 38.185044716791985},
];

path = addEquidistantPoints(path, 5); // 添加5个中间点
console.log(path);

这段代码会输出包含7个点的数组,包含原起点、5个等距中间点和原终点。

球面插值(长距离场景更准确)

如果两点跨越大范围(比如跨半球),线性插值会因为地球是球体而产生偏差。这时候可以用Google Maps JavaScript API的Geometry库提供的spherical.interpolate方法,基于球面进行精准插值:

首先确保加载Geometry库:

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"></script>

然后修改函数:

function addEquidistantPoints(path, numPointsToAdd) {
  if (path.length !== 2) return [...path];
  
  const [start, end] = path;
  const newPath = [start];
  
  // 计算每一步的插值比例:从1/(numPointsToAdd+1)到numPointsToAdd/(numPointsToAdd+1)
  for (let i = 1; i <= numPointsToAdd; i++) {
    const fraction = i / (numPointsToAdd + 1);
    const interpolatedPoint = google.maps.geometry.spherical.interpolate(
      new google.maps.LatLng(start.lat, start.lng),
      new google.maps.LatLng(end.lat, end.lng),
      fraction
    );
    newPath.push({
      lat: interpolatedPoint.lat(),
      lng: interpolatedPoint.lng()
    });
  }
  newPath.push(end);
  
  return newPath;
}

扩展:处理多点折线

如果你的path是多个连续点组成的折线,可以遍历每一对相邻点,插入中间点:

function addEquidistantPointsToPolyline(path, numPointsToAddPerSegment) {
  const newPath = [];
  for (let i = 0; i < path.length - 1; i++) {
    const segment = [path[i], path[i+1]];
    const segmentWithPoints = addEquidistantPoints(segment, numPointsToAddPerSegment);
    // 除了最后一个点,其他都加入(避免重复添加相邻段的端点)
    newPath.push(...segmentWithPoints.slice(0, -1));
  }
  // 添加最后一个端点
  newPath.push(path[path.length - 1]);
  return newPath;
}

内容的提问来源于stack exchange,提问作者Allerion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:25:26