数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载turf/voronoi是 Turf 模块化地理空间引擎中的一个轻量级模块输入一组Point点要素集合和一个边界框bbox即可输出一组以这些点为生成元的 Voronoi 多边形泰森多边形每个输入点对应一个覆盖其最近邻区域的封闭 Polygon。本文将以 packages/turf-voronoi/README.md 为核心结合仓库内 index.ts、test.ts 等源码讲解安装方式、参数细节、底层实现原理与测试基准帮助你直接落地“点→面区域划分”的空间分析场景如服务网点覆盖区、气象站影响区、商业选址划分。模块概览点集到 Voronoi 多边形voronoi(points, options)是模块导出的唯一核心函数。它接收一个点要素集合返回一个多边形要素集合每个多边形对应该点集合中的一个输入点。Voronoi 算法本身并未在 Turf 内部重复实现而是直接复用成熟的d3-voronoi包——这一点在源码注释与 README 中均有明确说明“The Voronoi algorithim used comes from the d3-voronoi package”。从 packages/turf-voronoi/package.json 可以看到模块的完整依赖关系d3-voronoi1.1.2Voronoi 图计算核心turf/helpers提供polygon、featureCollection、isObject等构造与校验工具turf/invariant提供collectionOf几何类型校验turf/clone提供cloneProperties属性克隆函数。该模块还声明了sideEffects: false便于 tree-shakingtype: module产物为标准 ESM导出指向dist/index.js与dist/index.d.ts。安装方式与 Turf 其他模块一样有两种安装路径方式一单独安装本模块$ npm install turf/voronoi方式二安装聚合包 turf/turfturf/turf把所有模块作为函数统一聚合导出安装后可直接通过turf.voronoi调用$ npm install turf/turf在仓库的 packages/turf/index.ts 中可以看到turf/turf聚合包正是通过export { voronoi } from turf/voronoi;将本模块重新导出。如果项目只需要 Voronoi 一个能力优先选择方式一以缩小打包体积。快速上手随机点生成 Voronoi 划分README 给出了一个可直接运行的最小示例先在指定 bbox 内生成 100 个随机点再对它们计算 Voronoi 多边形const options { bbox: [-70, 40, -60, 60] }; const points turf.randomPoint(100, options); const voronoiPolygons turf.voronoi(points, options); //addToMap const addToMap [voronoiPolygons, points];这里的关键配合是randomPoint的 bbox 与voronoi的 bbox 保持一致生成的随机点才会全部落在 Voronoi 计算的裁剪窗口内。randomPoint来自 packages/turf-random其bbox默认值为[-180,-90,180,90]voronoi的 bbox 默认值则见下文。单独使用模块时也可以不借助聚合包直接用命名导入import { voronoi } from turf/voronoi; import { featureCollection, point } from turf/helpers; const points featureCollection([ point([144.3, -37.1]), point([144.9, -37.3]), point([145.1, -36.4]), ]); const result voronoi(points, { bbox: [143, -38, 146, -35] });参数详解voronoi的函数签名与参数定义如下以 packages/turf-voronoi/index.ts 源码为准参数类型默认值说明pointsFeatureCollectionPoint必传围绕其计算 Voronoi 多边形的点要素集合optionsObject{}可选参数对象options.bboxBBox[-180, -85, 180, 85]裁剪矩形按[minX, minY, maxX, maxY]顺序需要注意一个细节README 中标注的 bbox 默认值为[-180,-85,180,-85]其中 maxY 写作了-85这是一个文档笔误实际源码 index.ts 中的默认值是[-180, -85, 180, 85]即以地球近似范围[-180, -85]左下角到[180, 85]右上角作为默认裁剪窗口。请以源码默认值为准。bbox决定了 Voronoi 图的边界生成的无限泰森多边形会被裁剪到该矩形内部因此 bbox 越小、越贴近点集分布范围输出多边形越集中、越能反映局部区域划分。源码级实现剖析从 index.ts 的实现可以看到完整的数据流1. 输入校验options options || {}; if (!isObject(options)) throw new Error(options is invalid); const bbox options.bbox || [-180, -85, 180, 85]; if (!points) throw new Error(points is required); if (!Array.isArray(bbox)) throw new Error(bbox is invalid); collectionOf(points, Point, points);校验链依次保证options必须是对象、points必传、bbox必须是数组、points必须是Point类型的要素集合collectionOf来自 packages/turf-invariant。任一条件不满足都会抛出带明确信息的Error。2. d3-voronoi 调用链return featureCollection( d3voronoi .voronoiFeaturePoint() .x((feature) feature.geometry.coordinates[0]) .y((feature) feature.geometry.coordinates[1]) .extent([ [bbox[0], bbox[1]], [bbox[2], bbox[3]], ]) .polygons(points.features) .map(function (coords, index) { return Object.assign(coordsToPolygon(coords), { properties: cloneProperties(points.features[index].properties), }); }) );核心链路分四步通过.x()/.y()指定每个要素的横纵坐标取值器——这里直接读取geometry.coordinates[0]与coordinates[1]即经度与纬度通过.extent([[minX, minY], [maxX, maxY]])将 bbox 数组转换为 d3-voronoi 要求的[[minX, minY], [maxX, maxY]]两点式裁剪范围.polygons(points.features)计算每个点的 Voronoi 胞腔多边形坐标.map()将每组坐标转为 GeoJSON Polygon并绑定原点的 properties。3. 闭合多边形构造function coordsToPolygon(coords: Position[]) { coords coords.slice(); coords.push(coords[0]); return polygon([coords]); }d3-voronoi 返回的多边形坐标序列首尾并不自动闭合首点与末点不同因此模块在 index.ts 中先浅拷贝坐标数组再把第一个坐标追加到末尾确保输出的 Polygon 满足 GeoJSON 环闭合要求最后交给turf/helpers的polygon()构造要素。4. 属性传递与克隆.map()的第二个参数index与输入点集合的索引一一对应每个 Voronoi 多边形都会继承对应输入点的properties。但属性不是直接引用而是经过cloneProperties深克隆见 packages/turf-clone/index.ts避免输出要素与输入要素共享可变属性对象。测试数据与基准表现仓库的 packages/turf-voronoi/test/in 目录存放了 4 组覆盖不同场景的 fixturesimple.json仅 1 个点位于澳大利亚墨尔本附近验证单点退化情形下仍能输出一个占满 bbox 的矩形多边形ninepoints.json9 个点常规多胞腔划分with-properties.json9 个带属性的点属性类型涵盖数字、字符串、嵌套对象与浮点数用于验证属性逐点克隆传递的正确性world.json8 个分布在全球各大洲的点验证大尺度 bbox 下的划分。测试入口 test.ts 基于 tape glob 实现遍历test/in/*.json中的所有 fixture读取其bbox字段作为 Voronoi 的裁剪窗口将结果与test/out/下预生成的期望输出逐深度比对t.deepEqual。若设置了环境变量REGEN则会重新写入输出文件以更新期望结果。这说明测试用例本身也演示了“将 bbox 写入 GeoJSON 顶层字段、再传给 voronoi”的推荐用法。基准脚本 bench.ts 使用 benchmark.js 对每个 fixture 执行voronoi(geojson, { bbox: geojson.bbox })其注释中记录的参考结果为ninepoints约22,169 ops/secsimple约142,285 ops/sec该数值仅为该机器上特定版本的快照实际环境请以自行运行pnpm bench的结果为准。常见用法与注意事项1. bbox 必须与点集范围匹配。Voronoi 输出的每个多边形都会被裁剪进 bbox若 bbox 远大于点集多边形会大面积“撑满”窗口边缘若 bbox 未覆盖某些点则会抛错或产生异常结果。推荐从点集自身范围如turf.bbox(points)或 FeatureCollection 的顶层bbox字段取窗口。2. 输入必须是Point要素集合。传入 LineString、Polygon 或其他几何类型时collectionOf校验会直接抛出Error。3. 输出要素数与输入点一一对应。返回的FeatureCollectionPolygon中多边形数量与输入点数量相同且按原顺序排列properties与原输入点保持一致——这为后续按网点/采样点做归属统计提供了便利。4. 经纬度坐标可直接使用。模块将坐标直接作为平面坐标交给 d3-voronoi未做投影换算。对于全球尺度或高纬度区域严格的 Voronoi 划分应先在等面积投影下计算再反投影当前实现不做该处理属于模块的既定简化。5. 版本与运行环境。当前仓库中turf/voronoi版本为7.4.0package.json声明engines.node 22产物为 ESM 格式浏览器与打包器环境需确保 d3-voronoi 的 ESM 兼容性。赞分享数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载相关推荐CANN/asc-devkit SIMT访存函数asc\_dcci\_single 产品支持情况 | 产品 | 是否支持 | | | | | Ascend 950PR/Ascend 950DT | √ | |人工智能深度学习算子库CANNAscend用 visx/delaunay 构建 Voronoi 交互层Delaunay 三角剖分与多边形渲染实战指南用 visx/delaunay 构建 Voronoi 交互层Delaunay 三角剖分与多边形渲染实战指南 本文聚焦 visx 生态中的 visx/del数据可视化前端图表库上一篇Prettier for PHP 0.1 发布解析从插件机制到 PSR 格式化哲学下一篇Halo 菜单层级模型重构剖析从 children 聚合到 menuName parent 引用式层级创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考