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

midpoint

先看结论

两点之间的球面中点:沿大圆航线各走一半,而不是经纬度取平均。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-29 · 引用本文
turf.midpoint(point1, point2) → Feature<Point>

参数

参数类型说明
point1Coord第一个点,[lng, lat] 或点要素
point2Coord第二个点

没有选项参数,返回的属性为空对象。需要属性时在结果上直接赋值。

示例

var a = turf.point([116.391263, 39.907359]);
var b = turf.point([121.473701, 31.230416]);

var mid = turf.midpoint(a, b);

console.log(mid.geometry.coordinates);
console.log(turf.distance(a, mid, { units: 'kilometers' }));
console.log(turf.distance(mid, b, { units: 'kilometers' }));

两段距离应当相等(浮点误差在米级以内)。 若用坐标平均,跨纬度时两段距离会明显不等。

与坐标平均的差别

方式跨北京—上海跨赤道—高纬
turf.midpoint落在大圆航线上沿最短路径,靠近极点
[(lng1+lng2)/2, (lat1+lat2)/2]偏差数十公里偏差可达上千公里

经纬度是角度而非平面坐标,直接平均在数学上没有意义。 任何「两点中间位置」的需求都应该用 midpoint。

用于线路标注

var line = turf.lineString([
  [116.30, 39.91],
  [116.36, 39.90],
  [116.42, 39.92]
]);

var ends = turf.getCoords(line).slice(0, 2);

var labelPoint = turf.midpoint(ends[0], ends[1]);
labelPoint.properties = { text: '起点段中点' };

多段线要按累计长度取中点时用 turf.along 配 turf.length, midpoint 只处理两个端点。

跨越日期变更线

两点经度相差接近 180 度时,大圆中点可能落在经度 180 附近。 结果经度仍在 -180 到 180 内,但在地图上直接连线会横穿整个屏幕。 渲染时把线拆段,或在样式里关闭跨线连线。

中点在球面上,不一定落在你的折线上。 两点之间的直线在平面上是直线,在球面上是大圆弧。 如果原始数据是沿道路的折线,两端的中点通常不在道路上。 需要沿线中点时用 turf.along。

引用本文

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