新闻详情

新闻详情

首页 / 资讯中心 / 详情

@turf/line-to-polygon 完全指南:将 LineString / MultiLineString 转换为 Polygon 的实现原理与实战用法

发布时间:2026/9/25 6:09:46来源:尧图网络
@turf/line-to-polygon 完全指南:将 LineString / MultiLineString 转换为 Polygon 的实现原理与实战用法
数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载turf/line-to-polygon是 Turf 模块化地理引擎中的核心转换模块负责将 (Multi)LineString 线要素转换为 Polygon 面要素是处理海岸线闭合、地块边界成面、线状要素栅格化前的必备工具。读完本文你将掌握该函数的全部参数语义autoComplete / orderCoords / mutate、三种输入形态Feature / FeatureCollection / 裸 Geometry的差异、环排序与自动闭合的底层算法以及如何用测试夹具验证转换结果。模块概览一行代码完成线到面的转换GeoJSON 规范中Polygon 的第一环是外环、其余环是内环孔洞且每个环必须是闭合的首尾坐标相同。但真实数据中的线要素往往是不闭合的、或者孔洞线与外轮廓线混在同一个 MultiLineString 中。lineToPolygon正是为了解决这些现实问题而生var line turf.lineString([[125, -30], [145, -30], [145, -20], [125, -20], [125, -30]]); var polygon turf.lineToPolygon(line);它支持三种输入形态见 index.ts 的类型签名输入形态TypeScript 类型输出单个 LineStringFeatureLineString \| LineString裸几何FeaturePolygon单个 MultiLineStringFeatureMultiLineString \| MultiLineStringFeaturePolygon多条线构成外环内环要素集合FeatureCollectionLineString \| MultiLineStringFeatureMultiPolygon每条线各成一个面输出始终是FeaturePolygon | MultiPolygon与 README.md 中描述的签名完全一致。参数详解四个选项决定转换结果函数签名为lineToPolygon(lines, options)options默认值为{}包含四个可选项。源码在 index.ts 中使用空值合并运算符处理默认值var properties options.properties; var autoComplete options.autoComplete ?? true; var orderCoords options.orderCoords ?? true; var mutate options.mutate ?? false;参数类型默认值作用linesFeatureCollection \| FeatureLineString \| MultiLineString必填待转换的线要素也接受裸 Geometry见 geometry-linestring.geojson 测试夹具options.propertiesObject{}显式指定输出 Feature 的 properties未传时继承输入 Feature 自身的 properties裸几何则得到{}options.autoCompletebooleantrue自动闭合线环当首尾坐标不一致时把首坐标追加到末尾GeoJSON Polygon 环必须是闭合的options.orderCoordsbooleantrue对 MultiLineString 的各条线按面积排序使外环面积最大者位于坐标数组第一位符合 GeoJSON 外环在前的规范options.mutatebooleanfalse是否直接修改输入数据。false时内部先clone一份保证原输入不被改动关键行为一properties 的继承优先级源码 index.ts 展示了一个三档回退逻辑properties properties ? properties : line.type Feature ? line.properties : {};即显式传入的options.properties优先级最高未传入且输入是 Feature 时继承该 Feature 的properties输入是裸 Geometry 时得到空对象。关键行为二mutate 与原数据保护当mutate为false默认时函数会先对输入执行clone(lines)来自turf/clone任何闭合、排序操作都发生在副本上。这意味着即使autoComplete往坐标数组 push 了新坐标也不会污染调用方的原始数据——测试 test.ts 中专门断言了t.deepEqual(originalInput, geojson)来验证输入未被修改。核心算法三条线如何变成一个面转换逻辑的核心是私有函数lineStringToPolygonindex.ts其流程为校验坐标通过turf/invariant的getGeom取出几何体若coords为空抛出line must contain coordinates。按类型分派LineString若开启autoComplete调用autoCompleteCoords闭合环然后包装成单环 PolygonMultiLineString逐条线处理配合orderCoords排序后打包成多环 Polygon第一个环为外环其余为内环其他类型抛出geometry type X is not supported测试 test.ts 用 Point 输入验证了该错误。FeatureCollection 分支入口函数中遍历每条线各自转成 Polygon 后收集其坐标最终组装为一个 MultiPolygon。autoCompleteCoords首尾坐标的自动缝合实现位于 index.tsfunction autoCompleteCoords(coords: Position[]) { var first coords[0]; var x1 first[0]; var y1 first[1]; var last coords[coords.length - 1]; var x2 last[0]; var y2 last[1]; if (x1 ! x2 || y1 ! y2) { coords.push(first); } return coords; }它比较首、尾坐标的 x/y 是否完全相等不相等就把首坐标追加到末尾从而形成闭合环。测试夹具 linestring-incomplete.geojson 提供了一条 8 个点、首尾不重合的开放线正是用于验证该逻辑。注意闭合判断是严格的坐标相等比较不涉及容差或投影计算。orderCoords按包围盒面积把外环排到第一位GeoJSON 规范要求 Polygon 坐标数组的第一个环必须是外环。当 MultiLineString 的各条线在输入中乱序排列时orderCoords负责重排。排序依据是各线的包围盒面积index.tsif (orderCoords) { var area calculateArea(turfBBox(lineString(coord))); if (area largestArea) { multiCoords.unshift(coord); largestArea area; } else multiCoords.push(coord); }辅助函数calculateAreaindex.ts用包围盒的跨度估算面积return Math.abs(west - east) * Math.abs(south - north);这里通过turf/bbox计算每条线的包围盒再取东西跨度 × 南北跨度作为面积排序键。面积最大的线被unshift到数组头部外环其余依次追加内环。需要说明的是这只是快速近似排序源码注释称之为 quick approximate area calculation (used to sort)并不做精确的地理面积计算——对于正常的外环包含内环场景已足够。测试夹具 multi-linestring-outer-ring-middle-position.geojson 专门构造了外环不在首位的输入用于验证重排逻辑multi-linestring-with-hole.geojson 则展示了一个外环 一个内环孔洞的标准甜甜圈结构内环坐标[100.2, 0.2] → [100.8, 0.8]明显小于外环会被正确排到外环之后。实战示例从零开始构建你的转换流程示例一闭合的单线README 原始示例import { lineString, lineToPolygon } from turf/turf; var line turf.lineString([[125, -30], [145, -30], [145, -20], [125, -20], [125, -30]]); var polygon turf.lineToPolygon(line); // polygon.geometry.type Polygon // polygon.geometry.coordinates[0] 即外环由于示例输入首尾坐标相同[125, -30]出现两次autoComplete检测到已闭合不会重复追加。示例二开放线自动闭合var openLine turf.lineString([ [131.0, -30.9], [125.4, -29.8], [121.7, -26.0], [121.5, -21.9], [127.7, -16.1], ]); var polygon turf.lineToPolygon(openLine); // autoCompletetrue默认时自动补上首坐标环闭合数据形态同 linestring-incomplete.geojson。如果你明确不想要闭合行为例如只想保留原始线段数可传入{ autoComplete: false }——测试 test.ts 验证了该选项下函数依然能正常返回结果。示例三FeatureCollection → MultiPolygonvar collection turf.featureCollection([ turf.lineString([[102, 2], [103, 2], [103, 3], [102, 3], [102, 2]]), turf.lineString([[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]), ]); var multiPolygon turf.lineToPolygon(collection); // 输出 FeatureMultiPolygon两条线各自成为一个 Polygon测试夹具 collection-linestring.geojson 与 linestrings-to-multipolygons.geojson 对应的正是这一形态。示例四外环 孔洞MultiLineString 甜甜圈var doughnut turf.multiLineString([ // 外环 [[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]], // 内环孔洞 [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]], ]); var polygon turf.lineToPolygon(doughnut); // coordinates[0] 外环coordinates[1] 内环孔洞数据形态同 multi-linestring-with-hole.geojson。更复杂的多孔洞场景见 multi-linestrings-with-holes.geojson 与 multi-linestrings-outer-doughnut.geojson。注意嵌套孔洞等复杂拓扑如 multi-linestring-nested.geojson 系列建议配合turf/unkink-polygon等工具做后续拓扑清理。安装与使用方式按 README.md 的说明有两种安装途径# 方式一仅安装本模块 $ npm install turf/line-to-polygon # 方式二安装 Turf 全家桶包含全部模块 $ npm install turf/turf本仓库基于 pnpm workspace 管理模块自身以 ESM 发布type: module见 package.json运行时要求node 22。它的运行时依赖是四个工作区模块turf/bbox包围盒计算、turf/clone数据克隆、turf/helperspolygon / multiPolygon / lineString 构造器、turf/invariant几何与坐标提取。如果你想在完整 Turf 项目中运行本模块测试可在仓库根目录执行pnpm --filter turf/line-to-polygon test源码结构、测试与性能验证源码组织本模块仅由一个入口文件构成index.ts包含导出函数lineToPolygon同时作为 default 导出兼容两种 import 风格私有辅助函数lineStringToPolygon、autoCompleteCoords、calculateArea。文档注释JSDoc直接写在源码中README 由documentation.js从注释自动生成因此源码注释与 README 始终同步。测试覆盖测试文件 test.ts 基于 tape 编写覆盖了 13 个输入夹具位于 test/in并通过process.env.REGEN支持一键重新生成期望输出out目录。测试断言除了结果深度相等外还额外校验输入未被 mutate。错误路径覆盖传入 Point → 抛出geometry type Point is not supported传入空坐标的 LineString → 抛出line must contain coordinates。类型安全由 types.ts 配合tsc --strict校验见 package.json 的test:types脚本。性能参考bench.ts 使用 benchmark 套件对全部夹具进行压测文件注释中记录了仓库维护时的历史数据例如单条闭合线约 6,752,969 ops/sec、带孔洞的 MultiLineString 约 1,018,657 ops/sec、多孔洞嵌套场景约 421,758 ops/sec。这些数值属于历史基准快照实际性能会随机器与 Node 版本浮动但它们可以说明得益于纯函数式设计与轻量依赖本模块在批量转换场景下开销很低可以作为数据流水线中的高频基础操作。常见问题与边界提醒输入会被修改吗默认mutate: false输入会被克隆绝对安全仅当你确认可以接受原数据被修改时才开启mutate以省去克隆开销。不闭合的线会怎样默认autoComplete: true会自动补上首坐标完成闭合关闭后输出的 Polygon 环可能不闭合需自行确保下游消费方接受GeoJSON 严格校验器会拒绝。环的顺序重要吗默认orderCoords: true按包围盒面积排序保证外环在第一位关闭后环序保持输入原样若外环不在首位部分 GIS 渲染与拓扑工具可能将其误判为内环。FeatureCollection 输出什么永远是MultiPolygon即使集合中只有一条线若你需要的是单个 Polygon请直接传 Feature 而非 FeatureCollection。孔洞判断依据是什么不是包含关系检测而是纯粹的面积最大者为外环近似排序极端情况下多条互不相交的大线会被排成外环 内环语义转换前应确认数据的拓扑预期。延伸阅读模块入口与核心实现index.ts官方 API 文档与源码 JSDoc 同步README.md测试套件与夹具目录test.ts、test/in性能压测脚本bench.ts依赖的底层模块packages/turf-bbox、packages/turf-clone、packages/turf-helpers、packages/turf-invariant聚合入口如需直接使用turf.lineToPolygonpackages/turf赞分享数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载相关推荐arduino-esp32 OpenThread 实战CoAP SimpleGet 客户端——仅凭 Network Key 入网并向 Leader RLOC 发起确认式 GETarduino esp32 OpenThread 实战CoAP SimpleGet 客户端——仅凭 Network Key 入网并向 Leader RLOC数据分析PyArrow 读写 Parquet 文件时如何只读取部分列并控制写入选项PyArrow 读写 Parquet 文件时如何只读取部分列并控制写入选项 用 PyArrow 处理 Parquet 文件时一个常见需求是文件里有几十列但数据分析turf/line-chunk 源码解析用 Turf.js 按指定长度切分 LineString 的完整实战指南turf/line chunk 源码解析用 Turf.js 按指定长度切分 LineString 的完整实战指南 导读 turf/line chunk 是数据分析上一篇WarcraftHelper经典游戏的现代系统适配与兼容性工具下一篇Hermes WebUI终极指南如何简单快速搭建你的本地AI助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

中秋国庆远程办公怎么办 中秋国庆远程办公软件怎么选 2026/9/25 7:21:13

中秋国庆远程办公怎么办 中秋国庆远程办公软件怎么选

中秋国庆远程办公,是不少职场人长假期间的常态,临时对接工作、处理紧急工单,却常被远控工具卡顿难用的问题困扰。中秋国庆远程办公想要高效不折腾,无需留守公司工位,无界趣连2.0就能轻松搞定各类异地办公需求&#xff…

阅读更多 →
用ps ax读懂Linux进程状态与调度器核心逻辑 2026/9/25 7:21:06

用ps ax读懂Linux进程状态与调度器核心逻辑

凌晨两点半,群里突然炸了。一台线上机器CPU跑到800%,监控大屏飘红,值班同事接连被抖醒。我登录服务器后没急着开top,第一件事是敲了一行命令:ps ax。为什么不是top?因为top是动态刷新加瞬时快照&#xff0c…

阅读更多 →
CodeCombat AP CSP Explore 任务教学指南:基于计算创新的影响开展 Performance Task 演练 2026/9/25 7:21:06

CodeCombat AP CSP Explore 任务教学指南:基于计算创新的影响开展 Performance Task 演练

游戏开发教育前端后端 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 点击查看 免费下载 导读 本文围绕 CodeCombat 的 AP 计算机科学原理(AP CS Principles, AP CSP&#xff0…

阅读更多 →
Apache DataFusion 52.4.0 更新深度解读:array_sort 空值语义修复、SMJ 行数缓存与动态过滤下推收紧等 11 项变更 2026/9/25 7:21:06

Apache DataFusion 52.4.0 更新深度解读:array_sort 空值语义修复、SMJ 行数缓存与动态过滤下推收紧等 11 项变更

大数据数据分析后端 【免费下载链接】datafusion Apache DataFusion SQL Query Engine 项目地址: https://gitcode.com/gh_mirrors/datafu/datafusion 点击查看 免费下载 本文基于 Apache DataFusion 52.4.0 官方变更日志(dev/changelog/52.4.0.md&…

阅读更多 →
F´ Topology 构建指南:从组件实例化、端口互连到活动组件任务启动的完整流程 2026/9/25 7:21:06

F´ Topology 构建指南:从组件实例化、端口互连到活动组件任务启动的完整流程

嵌入式系统编程 【免费下载链接】fprime F - A flight software and embedded systems framework 项目地址: https://gitcode.com/gh_mirrors/fp/fprime 点击查看 免费下载 本文以 F(F Prime)飞控软件与嵌入式系统框架为背景,系统…

阅读更多 →
ctf-wiki 内核利用实战:ret2usr 攻击手法解析——以 2018 强网杯 core 为例 2026/9/25 7:21:00

ctf-wiki 内核利用实战:ret2usr 攻击手法解析——以 2018 强网杯 core 为例

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 导读 ret2usr(return to user space)是 Linux 内核 pwn 中一种经典的控制流劫持提权…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉