首页 / Turf.js / API 文档
voronoi
先看结论
由点集生成泰森多边形:每个多边形内的任意位置,到对应站点的距离都比到其它站点近。
turf.voronoi(points, options?) → FeatureCollection<Polygon>
参数
| 参数 | 类型 | 说明 |
|---|---|---|
points | FeatureCollection<Point> | 站点集合 |
options.bbox | BBox | 裁剪矩形 [minX, minY, maxX, maxY] |
没有 bbox 时边界单元的顶点会延伸到很远,
生成的经纬度可能超出可用范围。实际使用中始终传入数据范围或研究区范围。
示例
var sites = turf.featureCollection([
turf.point([116.35, 39.88], { name: '西站' }),
turf.point([116.42, 39.94], { name: '东站' }),
turf.point([116.39, 39.85], { name: '南站' }),
turf.point([116.30, 39.95], { name: '北站' })
]);
var extent = turf.bbox(sites);
var cells = turf.voronoi(sites, { bbox: extent });
console.log(cells.features.length); // 每个输入点一个单元
结果的多边形按输入点顺序生成,单元属性为空对象。
需要携带站点信息时手动拷贝:cells.features[i].properties = sites.features[i].properties。
服务范围查询
function nearestCell(point) {
var hit = cells.features.find(function (cell) {
return turf.booleanPointInPolygon(point, cell);
});
return hit ? hit.properties : null;
}
逐个判断在大数量下很慢。泰森多边形的性质允许直接用最近距离找站点:
遍历站点算 turf.distance,取最小值,结果与点面判断一致。
与网格划分的区别
| 方式 | 形状 | 适用 |
|---|---|---|
turf.voronoi | 不规则多边形,边界为站点连线的中垂线 | 服务区、势力范围、最近设施 |
turf.squareGrid | 规则方格 | 统计汇总、栅格化 |
turf.hexGrid | 正六边形 | 密度分析、可视化 |
数据要求
站点必须有唯一坐标,重复点会让对应单元退化。 少量重复时先按坐标去重,或给重复点加入极小偏移。 站点数量很大(数万以上)时,生成与渲染成本都明显上升, 通常先聚合再生成。
bbox 要覆盖你想展示的全部区域。
裁剪框之外的单元不存在,用户点在框外时任何单元都不命中。
用 turf.buffer 把数据范围外扩一圈,再作为 bbox,
可以保证边界区域也有归属。
经纬志(2026)。《voronoi》。https://www.jingweizhi.com/turf/api/voronoi.html(访问日期 2026-11-03)。