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

distance

先看结论

两个点之间的球面距离,按指定单位返回数字。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-27 · 引用本文
turf.distance(from, to, options) → number

参数

参数类型说明
from / toPoint / Feature两个点,坐标顺序 [经度, 纬度]
options.unitsstring默认 kilometers,可选 meters、miles、nauticalmiles 等

返回值

一个数字,单位由 units 决定。坐标非法时为 NaN,函数不抛错。

示例

var tiananmen = turf.point([116.391263, 39.907359]);
var shanghai = turf.point([121.473701, 31.230416]);

var km = turf.distance(tiananmen, shanghai, { units: 'kilometers' });
var m  = turf.distance(tiananmen, shanghai, { units: 'meters' });

console.log(km.toFixed(1));   // 1067 左右
console.log(m.toFixed(0));    // 1 067 000 左右

公式与精度

内部使用 haversine 公式,地球半径取 6371 公里。 城市级距离的误差在米级以内,跨洲距离与 WGS84 椭球结果相差约千分之几。 做航线里程、物流计费这类需要与官方数据对齐的场景, 应改用 Vincenty 或投影后的平面距离,而不是调整 Turf 的参数。

和 length 的区别

distance 只接两个点。turf.length 接受线与面, 逐段累加。把一条线直接传进 distance, 得到的不是线长,而是两个「点」对象之间的距离计算, 结果没有意义。

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

console.log(turf.length(route, { units: 'kilometers' }));
/* lineString 求全长的正确写法 */

跨 180 度经线

从东经 179 度到西经 179 度,图上相距很远,实际只隔两个经度。 haversine 基于三维坐标计算,能正确处理这种跨线情况, 前提是你没有先做 lng + 360 之类的归一化。 屏幕上的连线仍可能横穿整幅地图,这是渲染问题,不是距离算错。

单位换算表

units 取值含义1 公里的数值
kilometers公里1
meters米1000
miles英里0.621371
nauticalmiles海里0.539957
feet英尺3280.84

先把单位统一,再做比较。一半数据按公里、一半按米排序时, 结果会完全失真。项目里约定一个内部单位(建议米), 只在与界面交互时换算。

引用本文

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