几何操作
本页面介绍 Turf.js 中操作和分析几何形状的主要地理空间操作。这些操作通过数学算法将输入几何体转换为新的几何形式,包括缓冲区创建、裁剪、凸包生成和网格创建。
对于空间关系函数(intersects、contains、within),请参见 布尔操作。对于线专用操作,请参见 线操作。对于测量和坐标转换,请参见 测量与变换。
操作分类
Turf 的几何操作按照功能分类组织,每个分类服务于特定的空间分析需求:
核心依赖和架构
几何操作依赖于 Turf 内部模块和外部计算几何库:
缓冲区操作
@turf/buffer 模块使用测地投影和 Java Topology Suite (JSTS) 算法在输入几何体周围创建缓冲区。
缓冲区算法实现
缓冲区操作使用复杂的坐标投影方法来处理地球曲率:
| Component | Purpose | Implementation |
|---|---|---|
defineProjection() | Creates azimuthal equidistant projection | Uses d3-geo.geoAzimuthalEquidistant() centered on feature |
projectCoords() | Converts to planar coordinates | Recursively projects coordinate arrays |
BufferOp.bufferOp() | Performs geometric buffer | JSTS library operation in projected space |
unprojectCoords() | Converts back to geographic | Inverse projection to WGS84 coordinates |
主 buffer() 函数通过递归处理处理多种几何类型:
- FeatureCollection:通过
featureEach()处理每个 feature - GeometryCollection:通过
geomEach()递归处理几何体 - 单个 Feature:通过
bufferFeature()直接处理
支持负缓冲区值用于"侵蚀"操作,但过大的负值可能导致无效几何体。
多边形裁剪操作
并集、交集和差集操作使用 polyclip-ts 库实现稳健的多边形裁剪算法。
裁剪操作矩阵
| 操作 | 模块 | 输入 | 输出 | 算法 |
|---|---|---|---|---|
| Union | @turf/union | 两个或多个多边形 | 单个合并后的多边形 | Greiner-Hormann 裁剪 |
| Intersect | @turf/intersect | 两个多边形 | 共享区域多边形 | Sutherland-Hodgman 裁剪 |
| Difference | @turf/difference | 基础多边形和裁剪多边形 | 剩余区域多边形 | 布尔差集操作 |
这三个操作都遵循类似的模式:
- 通过
@turf/invariant进行输入验证 - 通过
@turf/meta提取坐标 - 通过
polyclip-ts执行算法 - 使用
@turf/helpers打包结果
凸包生成
凸包操作使用不同的算法在点集周围创建边界多边形,用于凸包和凹包。
凸包算法比较
@turf/convex 模块使用 concaveman 库同时生成凸包和凹包,而 @turf/concave 提供额外的凹包专用功能和拓扑分析。
网格生成系统
网格生成在边界框内创建规则镶嵌用于空间分析和可视化。
网格类型规格
| 网格类型 | 模块 | 形状 | 镶嵌模式 |
|---|---|---|---|
| Hexagonal | @turf/hex-grid | 正六边形 | 蜂窝模式 |
| Square | @turf/square-grid | 矩形/正方形 | 笛卡尔网格 |
| Triangular | @turf/triangle-grid | 等边三角形 | 三角形格子 |
| Point | @turf/point-grid | 点 | 规则点数组 |
所有网格生成器共享通用参数:
- bbox:
[minX, minY, maxX, maxY]边界框 - cellSide:指定单位的单元大小
- units:
@turf/helpers中的距离单位 - mask:用于裁剪结果的可选多边形
@turf/square-grid 委托给 @turf/rectangle-grid 实现,而六边形和三角形网格实现自定义镶嵌算法。
等高线生成
等高线操作使用 marching squares 算法从网格数据生成等值线和等值带。
等高线处理流水线
@turf/isolines 和 @turf/isobands 都使用 marchingsquares 库进行等高线提取,但输出几何体不同:
- 等值线:生成表示等高线的
LineStringfeatures - 等值带:生成表示填充等高带的
Polygonfeatures
形状分析操作
形状分析函数计算几何属性并派生输入 features 的简化表示。
分析函数分类
| 类别 | 函数 | 目的 |
|---|---|---|
| 中心计算 | center(), centroid(), centerOfMass() | 查找代表点 |
| 形状简化 | simplify(), envelope() | 降低复杂度 |
| 坐标操作 | flip(), explode(), combine() | 转换坐标结构 |
| 空间聚合 | collect(), tag() | 基于空间关系组合 features |
@turf/simplify 模块实现 Ramer-Douglas-Peucker 算法用于线简化,而 @turf/envelope 使用 @turf/bbox-polygon 创建最小边界矩形。
性能考虑
几何操作具有不同的计算复杂度和内存需求:
算法复杂度
| 操作类型 | 典型复杂度 | 内存使用 | 优化策略 |
|---|---|---|---|
| 缓冲区 | O(n × steps) | 高(投影) | 减少 steps 参数 |
| 多边形裁剪 | O(n × m) | 中等 | 按边界预筛选 |
| 凸包生成 | O(n log n) | 低 | 空间索引 |
| 网格生成 | O(cells) | 中等 | 流式处理 |
| 等高线生成 | O(grid²) | 高 | 基于瓦片的处理 |
大数据集应使用 @turf/meta 迭代函数(featureEach、geomEach)分块处理以有效管理内存使用。