首页 / Turf.js / API 文档
distance
先看结论
两个点之间的球面距离,按指定单位返回数字。
turf.distance(from, to, options) → number
参数
| 参数 | 类型 | 说明 |
|---|---|---|
from / to | Point / Feature | 两个点,坐标顺序 [经度, 纬度] |
options.units | string | 默认 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)。