经纬志
首页 / Turf.js / API 文档

along

先看结论

沿一条折线,从起点前进指定距离,返回落点。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-27 · 引用本文
turf.along(line, distance, options) → Feature<Point>

参数

参数类型说明
lineLineString / Feature只接受线要素,面与多线需要先拆开
distancenumber从起点算起的距离,单位由 units 决定
options.unitsstring默认 kilometers,可写 meters、miles 等

返回值

一个 Point 类型的 Feature。距离超过线长时返回线的终点; 距离为 0 时返回起点。返回点没有额外属性, 需要沿线序号或里程信息时由调用方补上。

示例

var route = turf.lineString([
  [116.391263, 39.907359],   // 天安门
  [116.417600, 39.905200],   // 崇文门
  [116.455100, 39.909300]    // 国贸方向
]);

/* 线长:公里 */
var total = turf.length(route, { units: 'kilometers' });

/* 每 500 米取一个点 */
var step = 0.5;
var marks = [];
for (var d = 0; d <= total; d += step) {
  marks.push(turf.along(route, d, { units: 'kilometers' }));
}

console.log(total.toFixed(3), marks.length);

算的是弧长,不是直线插值

实现方式是逐段累加球面距离,找到目标距离所在的线段, 再在该段内按比例插值。因此拐弯多的线,取点间隔在图上看起来可能不均匀, 但沿线的实际里程是等距的。这一点和「按顶点数量等分」完全不同。

起点与终点的边界

  • distance: 0 返回第一个坐标,不做任何插值。
  • 距离大于线长时返回最后一个坐标,不报错,因此循环里不必额外判断。
  • 负距离不作为受支持的用法,需要反向取点时先把坐标数组反转。

只接受单条线

MultiLineString 会让函数无法确定「第 2 公里属于哪一段」,结果不可用。 正确做法是先取出其中一段,或者用 turf.lineSlice 之类的工具处理。

var multi = turf.multiLineString([
  [[116.39, 39.90], [116.42, 39.91]],
  [[116.42, 39.91], [116.46, 39.93]]
]);

/* 多线先合并成单线再取点 */
var merged = turf.lineString(
  multi.geometry.coordinates.reduce(function (acc, part) {
    return acc.concat(part);
  }, [])
);

var p = turf.along(merged, 1, { units: 'kilometers' });

性能与批量用法

每次调用都会重新计算整条线的分段长度,密集取点会重复做同样的工作。 需要几百个点以上时,自己先算好累积里程表,再一次性插值, 复杂度从「点数 × 段数」降到「段数 + 点数」。

单位写错是最常见的错误。turf.along(line, 500) 表示沿线 500 公里,不是 500 米。展示里程时统一传 { units: 'meters' },可以避免在调用处反复换算。

引用本文

经纬志(2026)。《along》。https://www.jingweizhi.com/turf/api/along.html(访问日期 2026-11-03)。