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

voronoi

先看结论

由点集生成泰森多边形:每个多边形内的任意位置,到对应站点的距离都比到其它站点近。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-29 · 引用本文
turf.voronoi(points, options?) → FeatureCollection<Polygon>

参数

参数类型说明
pointsFeatureCollection<Point>站点集合
options.bboxBBox裁剪矩形 [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)。