首页 / Turf.js / API 文档
midpoint
先看结论
两点之间的球面中点:沿大圆航线各走一半,而不是经纬度取平均。
turf.midpoint(point1, point2) → Feature<Point>
参数
| 参数 | 类型 | 说明 |
|---|---|---|
point1 | Coord | 第一个点,[lng, lat] 或点要素 |
point2 | Coord | 第二个点 |
没有选项参数,返回的属性为空对象。需要属性时在结果上直接赋值。
示例
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)。