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

centroid

先看结论

计算要素所有顶点坐标的平均值,作为代表点。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-27 · 引用本文
turf.centroid(geojson, options) → Feature<Point>

参数

参数类型说明
geojson任意 GeoJSON多点、多线、多面、FeatureCollection 都可以
options.propertiesobject附加到返回点上的属性

返回值

一个 Point 类型的 Feature,坐标为 [经度, 纬度]。

示例

var district = turf.polygon([[
  [116.30, 39.88], [116.42, 39.88], [116.44, 39.92],
  [116.40, 39.97], [116.32, 39.95], [116.30, 39.88]
]]);

var c = turf.centroid(district, { properties: { label: '区域中心' } });
console.log(c.geometry.coordinates);        // [116.36…, 39.92…]
console.log(c.properties.label);            // 区域中心

三种「中心」不一样

函数算法适合
turf.center外包矩形的几何中心快速定位、视野居中最稳
turf.centroid所有顶点的算术平均顶点分布均匀的面;多要素合并成一个代表点
turf.centerOfMass按面积加权真实重心,适合放置标注

顶点均值对顶点分布敏感。一个面如果一条边被细分成很多点, centroid 会被拉向那条边;面积加权的 centerOfMass 不受影响。多边形顶点数相差悬殊时, 用 centroid 得到的位置可能落在图形之外, 而 centerOfMass 对凸多边形一定落在内部。

var a = turf.centroid(district);
var b = turf.centerOfMass(district);
var c = turf.center(district);

console.log(a.geometry.coordinates);
console.log(b.geometry.coordinates);
console.log(c.geometry.coordinates);

多点求中心

对点集调用 centroid,得到的是所有点坐标的平均, 与逐个求和再除以数量等价,但不必自己写循环。 需要「到各点距离总和最小」的中心时,那是几何中位数问题, 与坐标平均不是一回事,要单独用迭代算法求解。

跨 180 度经线的结果

顶点均值直接对经度做算术平均。数据集横跨 179 度和 -179 度时, 平均值会落在 0 度附近,跑到了地球另一侧。跨线数据先统一经度区间, 或者在计算后按业务范围修正。

标签定位优先用 centerOfMass。顶点均值在凹形面上可能落到面外, 地图上的标注会看起来挂在不相关的区域。

引用本文

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