首页 / Turf.js / API 文档
along
先看结论
沿一条折线,从起点前进指定距离,返回落点。
turf.along(line, distance, options) → Feature<Point>
参数
| 参数 | 类型 | 说明 |
|---|---|---|
line | LineString / Feature | 只接受线要素,面与多线需要先拆开 |
distance | number | 从起点算起的距离,单位由 units 决定 |
options.units | string | 默认 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)。