数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载Turf.js 4.1.0 是这套模块化地理空间引擎JavaScript/TypeScript在 4.x 系列中的一个重要 minor 版本它一口气引入了lineArc、polygonToLine、bboxClip、lineOverlap四个全新模块同时为点网格生成、坐标精度截断、类型校验与距离换算等既有能力做了增强与修复。阅读本篇你将掌握这四个新模块的调用方式与参数细节理解pointGrid的centered改进、truncate对precision0的处理并了解turf/invariant与turf/helpers底层修复对日常开发的实际影响——所有结论均以本仓库 4.1.0 时代及之后的源码为事实依据。说明4.1.0 发布说明最初以 GitHub Milestone 的形式跟踪发布进度对应 4.1.0 Milestone。本文依据 releases/4.1.0.md 的发布内容并结合 packages/ 目录下的各模块源码、测试与 README 进行印证与展开。一、发布概览4.1.0 带来了什么根据 releases/4.1.0.md4.1.0 的核心变更分为三类类别内容新模块turf/line-arc、turf/polygon-to-linestring、turf/bbox-clip、turf/line-overlap增强pointGrid新增centered参数helpers、invariant、meta改为单一module.export导出方式Bug 修复Turf.invariant修复字符串坐标校验失败turf-truncate修复precision0处理Turf 核心库补齐radiansToDistance、distanceToRadians、distanceToDegrees移除turf/polygon-unkink中对process.hrtime的依赖在统一入口层面四个新模块均已汇入 packages/turf/index.ts例如第 12 行导出bboxClip、第 70 行导出lineArc、第 74 行导出lineOverlap、第 98 行导出polygonToLine、第 123 行导出truncate、第 125 行导出unkinkPolygon因此既可按单模块安装也可通过turf/turf全量使用。二、新模块一turf/line-arc —— 按方位角生成圆弧lineArc以给定圆心、半径在起始方位角bearing1与结束方位角bearing2之间创建一段圆弧返回FeatureLineString。其中 0 度方位角指向圆心正北方向角度按顺时针方向递增。参数详解以 packages/turf-line-arc/index.ts 的函数签名为准参数类型说明centerCoord圆心坐标Point Feature / Point Geometry / 坐标数组均可radiusnumber圆弧半径bearing1number起始半径的方位角十进制角度bearing2number结束半径的方位角十进制角度options.stepsnumber构成圆弧的直线段数量默认64options.unitsUnits半径与destination计算的单位默认kilometers支持 Turf 全部合法单位核心实现与边界处理从 packages/turf-line-arc/index.ts 可以看到几个值得注意的实现细节角度归一化convertAngleTo360第 87-93 行先将任意角度取模 360 并修正负数得到 0-360 之间的有效角度因此传入负方位角或超过 360 度的角度也能被正确解析。整圆快捷路径当两个方位角归一化后相等如都传 25lineArc直接返回circle(center, radius, options)的坐标即生成完整圆形而不是退化的空弧。跨 0 度方向的处理当angle1 angle2时结束角度会加上 360arcEndDegree angle2 360保证弧线始终沿顺时针方向从起始角扫到结束角例如从 350 度扫到 10 度时不会反向绕行。末顶点钉住结束角循环使用arcStep (arcEndDegree - arcStartDegree) / steps均匀插值并刻意把最后一个顶点i steps直接钉在arcEndDegree上第 70-71 行。源码注释解释了原因浮点累积误差可能导致arcStartDegree i * arcStep溢出目标角如出现29.000000000000004从而丢掉最后一个顶点、使圆弧无法精确抵达 bearing2。这一修复保证终点坐标严格落在结束方位角上。使用示例var center turf.point([-75, 40]); var radius 5; var bearing1 25; var bearing2 47; var arc turf.lineArc(center, radius, bearing1, bearing2); // addToMap var addToMap [center, arc];内部每个顶点都是通过turf/destination在球面上以给定方位角与距离求解的源码第 72-73 行因此圆弧自然地贴合地球球面几何而非平面欧氏圆。安装$ npm install turf/line-arc三、新模块二turf/polygon-to-line —— 多边形转线polygonToLine将Polygon转为LineString或MultiLineString将MultiPolygon转为FeatureCollection其中每个元素为LineString或MultiLineString。该模块在 packages/turf-polygon-to-line/index.ts 中实现。参数与返回规则参数类型说明polyFeaturePolygon\|MultiPolygon待转换的面要素options.propertiesObject覆盖/翻译到输出要素上的 GeoJSON properties默认{}返回值的分型规则由 coordsToLine 决定外环 洞coords 长度 1返回MultiLineString每个环外环与每个内环各对应一条线单一外环返回单个LineStringMultiPolygon 输入每个 Polygon 独立转换后放入FeatureCollection返回。properties的处理逻辑在 源码第 40-42 行若未显式传入options.properties且输入是 Feature则自动继承原要素的properties输入为裸 Geometry 时则使用空对象。使用示例var poly turf.polygon([[[125, -30], [145, -30], [145, -20], [125, -20], [125, -30]]]); var line turf.polygonToLine(poly); // addToMap var addToMap [line];安装$ npm install turf/polygon-to-line四、新模块三turf/bbox-clip —— 按包围盒裁剪要素bboxClip接受一个LineString | MultiLineString | Polygon | MultiPolygon要素和一个[minX, minY, maxX, maxY]顺序的 BBox将要素裁剪到包围盒内返回裁剪后的同类要素。它内部复用了 Mapbox 的 lineclip。类型分派与退化处理入口函数 按几何类型分派LineString / MultiLineString逐条线调用lineclip裁剪结果若只有一条线返回LineString多条则聚合成MultiLineStringPolygon对每个环调用polygonclipMultiPolygon逐个 Polygon 裁剪后聚合返回MultiPolygon其他几何类型直接抛出geometry type not supported错误。clipPolygon第 76-93 行负责多边形环的后处理裁剪后若首尾点不重合则补回闭合点并丢弃顶点数不足 4 的退化环。文档与源码均提示裁剪 Polygon 时可能产生退化边degenerate edges这是该算法的已知特性使用时需要留意。使用示例var bbox [0, 0, 10, 10]; var poly turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]); var clipped turf.bboxClip(poly, bbox); // addToMap var addToMap [bbox, poly, clipped];安装$ npm install turf/bbox-clip五、新模块四turf/line-overlap —— 提取两要素的重叠线段lineOverlap接受任意LineString | MultiLineString | Polygon | MultiPolygon返回两者之间重叠部分的FeatureCollectionLineString。实现位于 packages/turf-line-overlap/index.ts。核心机制空间索引 逐段比对空间索引加速首先用turf/line-segment把line1拆成线段载入turf/geojson-rbush的 R-tree第 59-60 行逐段搜索遍历line2的每个线段用tree.search只取同一包围盒内的候选线段做精确比对避免全量两两比较第 67-88 行三种重叠判定第 94-135 行两线段坐标排序后完全相等fast-deep-equal端点落在对方线段上booleanPointOnLine零容差模式通过nearestPointOnLine计算端点到线段的最近距离并对比容差非零容差模式。线段合并连续重叠的线段通过concatSegment第 163-181 行按首尾相接的方式拼接为完整重叠线只有端点无法衔接时才会单独输出。容差参数参数类型默认值说明line1LineString\|MultiLineString\|Polygon\|MultiPolygon—参与比较的要素line2同上—参与比较的另一要素options.tolerancenumber0匹配重叠线段的容差距离单位千米注意容差以千米计启用时tolerance ! 0搜索包围盒会先通过lengthToDegrees将容差换算为经纬度并向外扩展第 76-84 行避免候选线段在 R-tree 检索阶段被漏掉。使用示例var line1 turf.lineString([[115, -35], [125, -30], [135, -30], [145, -35]]); var line2 turf.lineString([[115, -25], [125, -30], [135, -30], [145, -25]]); var overlapping turf.lineOverlap(line1, line2); // addToMap var addToMap [line1, line2, overlapping];安装$ npm install turf/line-overlap六、增强pointGrid 的 centered 参数pointGrid根据 BBox 与单元格边长生成点网格返回FeatureCollectionPoint。4.1.0 为其新增centered参数使网格点可以相对包围盒居中排布。参数与默认值packages/turf-point-grid/index.ts 中定义的参数包括参数类型默认值说明bboxBBox—[minX, minY, maxX, maxY]顺序的包围盒cellSidenumber—点间距options.unitsUnitskilometerscellSide的单位传mask时强制为kilometers见 第 45 行options.maskFeaturePolygon\|MultiPolygon无传入后只有落在该面内的网格点才会被保留通过booleanWithin判定第 82-87 行options.propertiesObject{}附加到每个网格点的属性options.centeredbooleanfalse是否将网格原点居中于包围盒centered 的底层效果从 源码第 73-77 行 看无论是否居中实现都先计算网格行列数再用deltaX (bboxWidth - columns * cellWidth) / 2、deltaY (bboxHeight - rows * cellHeight) / 2得到偏移量。centered: true时应用该偏移使网格整体居中网格外圈与包围盒边缘的距离对称centered: false时偏移为零网格从包围盒西南角west/south起铺排。行/列计算用Math.floor向下取整因此包围盒边角可能容纳不下完整的整行整列。使用示例var extent [-70.823364, -33.553984, -70.473175, -33.302986]; var cellSide 3; var options {units: miles, centered: true}; var grid turf.pointGrid(extent, cellSide, options); // addToMap var addToMap [grid];七、增强helpers / invariant / meta 的统一导出4.1.0 将turf/helpers、turf/invariant、turf/meta三个基础包收敛为单一module.export导出方式统一了模块的对外接口形态为后续 TypeScript 化与 tree-shaking 提供了更一致的入口。当前仓库中packages/turf-helpers/index.ts、packages/turf-invariant/index.ts、packages/turf-meta/index.ts 均以命名导出named export的形式暴露其全部工具函数。八、Bug 修复解读8.1 Turf.invariant字符串坐标校验失败修复前turf/invariant在坐标是字符串值时会出现校验失败。当前 packages/turf-invariant/index.ts 的getCoord实现明确要求传入的数组必须长度 ≥ 2、且coord[0]与coord[1]都不是数组即元素本身是数值才被视为合法坐标否则抛出coord must be GeoJSON Point or an Array of numberscontainsNumber 则用isNumber严格检查坐标是否只包含数字。这意味着调用方应保证坐标是数值数组而不是直接传入字符串字面量例如[-75, 40]——修复后的校验路径会对这类输入给出明确错误而非静默失败。8.2 turf-truncateprecision0 的处理truncate用于截断 GeoJSON 几何的坐标精度默认precision6、coordinates3默认保留最多 3 维坐标常用于剥离 z 值。4.1.0 修复了precision0时因旧的默认值判断逻辑把 0 当作 falsy 而回退到默认精度导致截断不生效的问题。当前 packages/turf-truncate/index.ts 的默认值判断已改为显式的undefined/null/NaN检查因此precision0会被当作合法值保留配合 truncateCoords 中的Math.round(coords[i] * factor) / factor此时factor 10^0 1坐标小数部分被完全抹去、保留整数部分var point turf.point([ 70.46923055566859, 58.11088890802906, 1508 ]); var options {precision: 0, coordinates: 2}; var truncated turf.truncate(point, options); // truncated.geometry.coordinates [70, 58]注意options.mutate默认false控制是否原地修改输入为false时函数会先深拷贝JSON.parse(JSON.stringify(geojson))第 60-61 行避免污染原始数据。8.3 核心库补齐距离-角度换算函数4.1.0 把turf/helpers中的radiansToDistance、distanceToRadians、distanceToDegrees汇入 Turf 核心库。在当前仓库中距离换算的底层实现位于 packages/turf-helpers/index.tsradiansToLength按单位因子radians * factor把弧度换算为千米等友好单位lengthToRadians做反向换算lengthToDegrees则先转弧度再radiansToDegrees而radiansToDegrees第 779 行起还会先用radians % (2 * Math.PI)归一化超出一圈的弧度值。这四个新入口使得在主入口turf/turf下也能直接完成弧度/角度/距离之间的换算而无需单独导入 helpers 包。8.4 turf/polygon-unkink移除 process.hrtimeunkinkPolygon用于把自相交kinked的多边形分解为无扭结的多边形集合内部依赖 simplepolygon 可见模块现在只做纯几何处理先用flattenEach展平输入、过滤出Polygon类型再逐一对每个面调用simplepolygon并把结果重建为FeatureCollectionPolygonconst poly turf.polygon([[[0, 0], [2, 0], [0, 2], [2, 2], [0, 0]]]); const result turf.unkinkPolygon(poly); // addToMap const addToMap [poly, result];这一改动也提升了模块在浏览器环境等非 Node 场景下的可用性。九、实践建议与版本适用说明模块粒度安装以上四个新模块均可单独安装npm install turf/xxx也可以整体使用turf/turf在 packages/turf/index.ts 中统一 re-export仓库采用 pnpm workspace 管理见 pnpm-workspace.yaml。面要素裁剪的注意事项bboxClip裁剪 Polygon 可能产生退化边裁剪后若用于拓扑或面积计算建议结合unkinkPolygon等工具做后处理。重叠分析的容差语义lineOverlap的tolerance单位为千米且会影响 R-tree 检索窗口调试时应先在小数据上验证容差换算是否符合预期。坐标数据卫生invariant修复提示我们传给 Turf 的坐标必须是数值数组truncate的precision0、coordinates参数可用于精简输出体积或剔除 z 值mutate开关可控制是否原地修改。版本以当前仓库为准本文所述行为以本仓库中的实现为准仓库内模块均已演进为 TypeScript 实现各模块index.ts与 tsconfig.shared.json 对应与 4.1.0 发布时的 JavaScript 时代源码在具体代码形态上存在差异但 API 语义与修复目标保持一致。通过以上解读你可以直接在本仓库的 packages/ 目录下按模块查看完整源码与 test 等测试数据进一步验证各新模块在不同输入下的行为并据此在自己的项目中安全地组合使用这些地理计算能力。赞分享数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载相关推荐KubeSphere v3.4.1 版本全解析四大模块 Bug 修复与稳定性增强实战指南KubeSphere v3.4.1 版本全解析四大模块 Bug 修复与稳定性增强实战指南 导读 本文基于 KubeSphere 开源仓库中的官方版本说明 CH后端云原生容器编排微服务NocoDB 0.260.5版本发布关键Bug修复与功能增强NocoDB 0.260.5版本发布关键Bug修复与功能增强 项目简介 NocoDB是一款开源的NoSQL数据库工具它可以将传统的关系型数据库如MySQL数据库低代码后端前端RuboCop 1.45.1 补丁版本解析四个关键 Bug 修复与升级指南RuboCop 1.45.1 补丁版本解析四个关键 Bug 修复与升级指南 导读 本文基于 RuboCop 官方发布说明 relnotes/v1.45.1.m代码质量Lint格式化静态分析开发工具上一篇终极Solidity审计清单SmartContracts-audit-checklist核心功能详解下一篇专家级教程gh_mirrors/dotfi/dotfiles源码结构深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考