首页 / Turf.js / API 文档
centroid
先看结论
计算要素所有顶点坐标的平均值,作为代表点。
turf.centroid(geojson, options) → Feature<Point>
参数
| 参数 | 类型 | 说明 |
|---|---|---|
geojson | 任意 GeoJSON | 多点、多线、多面、FeatureCollection 都可以 |
options.properties | object | 附加到返回点上的属性 |
返回值
一个 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)。