当前位置: 首页 > news >正文

别再死记硬背了!PostGIS的17种Geometry类型,我用一张图帮你理清

一张图掌握PostGIS几何类型:从零散记忆到系统认知

第一次接触PostGIS的几何类型时,我盯着那17种类型名称发呆了半小时——Point、LineString、Polygon这些基础类型还算直观,但到了CircularString、CompoundCurve这些曲线类型,大脑就开始自动进入"死记硬背然后迅速遗忘"的循环。直到我画出了它们之间的关系图,一切突然变得清晰起来。本文将分享这个视觉化学习框架,帮你摆脱机械记忆,真正理解PostGIS几何类型的设计逻辑。

1. 几何类型全景图:两大标准与三大类别

PostGIS的几何类型体系融合了两种国际标准:OGC简单要素标准(SFA)和SQL/MM空间标准。理解这个背景至关重要,因为类型划分的逻辑就源于此。

graph TD A[几何类型] --> B[OGC简单要素] A --> C[SQL/MM曲线扩展] B --> D[基础类型] B --> E[集合类型] D --> F[Point] D --> G[LineString] D --> H[Polygon] E --> I[MultiPoint] E --> J[MultiLineString] E --> K[MultiPolygon] E --> L[GeometryCollection] C --> M[曲线类型] C --> N[曲线集合] M --> O[CircularString] M --> P[CompoundCurve] M --> Q[CurvePolygon] N --> R[MultiCurve] N --> S[MultiSurface]

表:PostGIS几何类型分类体系(注:实际使用时请替换为合规的表格形式)

这个结构揭示了三个关键认知:

  1. 基础与扩展的区分:OGC标准定义的是基础几何类型,而SQL/MM扩展了曲线相关类型
  2. 原子与集合的层级:单个要素(如Point)与要素集合(如MultiPoint)形成层级关系
  3. 二维与多维的坐标:所有类型都可以带Z(高程)、M(测量)或ZM值

2. OGC标准类型:点线面的基础世界

OGC简单要素标准定义的几何类型构成了空间数据建模的基础。这些类型可以分为原子类型和集合类型两大类。

2.1 原子类型:空间要素的基石

  • Point:最简单的几何类型,表示空间中的一个位置

    -- 创建带SRID的Point SELECT ST_GeomFromText('POINT(-71.060316 42.357575)', 4326);
  • LineString:由两个或多个点组成的线段

    -- 创建包含三个点的LineString SELECT ST_GeomFromText('LINESTRING(-71.060 42.357, -71.061 42.358, -71.062 42.359)', 4326);
  • Polygon:由外环和可选内环(孔洞)组成的封闭区域

    -- 创建带孔洞的Polygon SELECT ST_GeomFromText('POLYGON((-71.063 42.360, -71.062 42.360, -71.062 42.359, -71.063 42.359, -71.063 42.360), (-71.0628 42.3598, -71.0626 42.3598, -71.0626 42.3596, -71.0628 42.3596, -71.0628 42.3598))', 4326);

2.2 集合类型:要素的组合与组织

集合类型用于管理多个同类型或不同类型几何对象的组合:

类型描述示例
MultiPoint点的集合MULTIPOINT((-71.06 42.35), (-71.07 42.36))
MultiLineString线串的集合MULTILINESTRING((-71.06 42.35, -71.07 42.36), (-71.08 42.37, -71.09 42.38))
MultiPolygon多边形的集合MULTIPOLYGON(((-71.06 42.35, -71.07 42.35, -71.07 42.36, -71.06 42.36, -71.06 42.35)), ((-71.08 42.37, -71.09 42.37, -71.09 42.38, -71.08 42.38, -71.08 42.37)))
GeometryCollection混合类型集合GEOMETRYCOLLECTION(POINT(-71.06 42.35), LINESTRING(-71.06 42.35, -71.07 42.36))

注意:集合类型中的要素应该拓扑一致,比如MultiPolygon中的多边形不应相互重叠

3. SQL/MM曲线扩展:真实世界的精确表达

传统GIS中的直线段难以精确表达自然界的曲线特征,这正是SQL/MM标准扩展的价值所在。PostGIS实现了五种曲线相关类型:

3.1 曲线类型的三层结构

  1. 基本曲线单元:CircularString

    • 用三个点定义一段圆弧
    -- 创建180度的半圆 SELECT ST_GeomFromText('CIRCULARSTRING(0 0, 1 1, 2 0)', 4326);
  2. 复合曲线:CompoundCurve

    • 组合直线段(CircularString)和曲线段(LineString)
    -- 创建直线与曲线组合的路径 SELECT ST_GeomFromText('COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 2 0), (2 0, 3 0))', 4326);
  3. 曲线多边形:CurvePolygon

    • 用曲线定义边界的面
    -- 创建圆形面 SELECT ST_GeomFromText('CURVEPOLYGON(CIRCULARSTRING(0 0, 1 1, 2 0, 1 -1, 0 0))', 4326);

3.2 曲线集合类型

  • MultiCurve:曲线对象的集合

    SELECT ST_GeomFromText('MULTICURVE(CIRCULARSTRING(0 0, 1 1, 2 0), LINESTRING(2 0, 3 0))', 4326);
  • MultiSurface:曲面对象的集合

    SELECT ST_GeomFromText('MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 1 1, 2 0, 1 -1, 0 0)), POLYGON((3 0, 4 0, 4 1, 3 1, 3 0)))', 4326);

提示:大多数GIS客户端仍无法直接显示曲线几何,可以使用ST_CurveToLine()函数转换为线性近似

4. 几何类型的实战应用策略

理解了类型体系后,如何在项目中合理应用这些几何类型?以下是我的实践经验总结。

4.1 类型选择决策树

  1. 是否需要精确曲线

    • 是 → 考虑CircularString/CurvePolygon
    • 否 → 使用LineString/Polygon
  2. 要素是否单一

    • 单一 → 使用原子类型(Point/LineString/Polygon)
    • 多个 → 使用集合类型(Multi*)
  3. 是否需要混合类型

    • 是 → GeometryCollection
    • 否 → 特定集合类型

4.2 性能与兼容性考量

  • 存储效率:曲线类型通常比线性近似占用更少空间
  • 计算精度:曲线运算更精确但计算成本更高
  • 工具兼容:评估您的工作流是否支持曲线类型
-- 曲线与线性近似的比较示例 SELECT ST_Length(ST_GeomFromText('CIRCULARSTRING(0 0, 1 1, 2 0)')) AS curve_length, ST_Length(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(0 0, 1 1, 2 0)'))) AS linear_length;

4.3 可视化与分析的平衡

在实际项目中,我常采用"曲线存储+线性分析"的混合策略:

  1. 原始数据以曲线类型存储
  2. 分析时按需转换为线性近似
  3. 可视化根据客户端能力选择适当形式
-- 混合使用示例 CREATE TABLE roads ( id serial PRIMARY KEY, name text, original_geom geometry(CompoundCurve,4326), linear_geom geometry(LineString,4326) GENERATED ALWAYS AS (ST_CurveToLine(original_geom)) STORED );

这种策略既保持了数据的几何精度,又确保了与现有工具的兼容性。

http://www.zskr.cn/news/1497078.html

相关文章:

  • Pandas多维聚合实战:生产级数据管道的5种工业级模式
  • Rasa 2.1.x GPU训练Docker实战:CUDA 11.0适配与镜像分层构建
  • HAL库 vs 寄存器:拆解RM遥控器接收程序,聊聊底层操作那些事儿
  • 微信投票怎么防止刷票丨防刷投票平台推荐(2026全网实测对比) - 微信投票小程序
  • 被税局提示收入申报偏低,一个广州花都餐饮老板配合自查、合规整改的经历 | 案例复盘 - 欢欢在创业
  • 解决VINS-Fusion轨迹保存与EVO格式不匹配:手把手修改三个C++源码文件
  • ESP32+MPU6050避坑指南:从I2C通信失败到Processing 3D姿态可视化,我踩过的那些坑
  • 2026最新的 国内以及河北地区硅胶板生产厂家实力排行及采购参考 硅胶板,减震硅胶板,工业硅胶板,防静电硅胶板,耐磨硅胶板 - 奔跑123
  • 多维聚合中的数据操作:超越GROUP BY的实战方法论
  • 用F28335的GPIO输入滤波功能,实现稳定的按键与传感器信号采集
  • 在Ubuntu 20.04上,我是如何一步步搞定Xenomai 3.2.1实时内核与IgH主站的(附完整避坑清单)
  • 不是所有回收都靠谱!郑州资质门店,国检级检测 - 奢侈品回收评测
  • 告别拼接烦恼:ENVI 5.3 实战GDEM高程数据拼接与.dat_bil格式转换保姆级教程
  • Vue项目里用高德地图Loca插件做个炫酷的物流流向图(附完整代码)
  • Modbus地址400001和HR0说的是一个东西吗?一次讲清PLC、上位机里的地址换算
  • Scons实战:5个真实C/C++项目构建模板,教你高效管理多文件与库依赖
  • 树莓派物联网神器:IOTstack快速搭建指南,10分钟打造智能家居系统
  • 保姆级教程:在Ubuntu 22.04上从零搭建Open vSwitch虚拟交换机(附常用命令速查表)
  • 告别灰蒙蒙!用HDRTVNet一键将普通SDR视频升级为HDR大片(附保姆级配置教程)
  • 7-3 地下迷宫探索 (30 分)
  • Sokit完整指南:如何快速掌握TCP/UDP网络调试终极工具
  • 天津黄金变现哪家靠谱?五大回收门店测评首选禹竞名奢汇 - 名奢变现站
  • 备忘录:Camulator与Simpleperf(硬件实测)的对比实验
  • MC13883 PMIC过压保护与反向充电:原理、设计与调试实战
  • 保姆级教程:用北醒TFmini-i-CAN雷达给PixHawk飞控解锁避障和定高(附完整参数表)
  • 关于tvs选型及参数详解esd
  • 郑州石英石大板一手货源采购指南|2026年源头工厂vs代理商完整对标 - 年度推荐企业名录
  • 广州花都餐饮公司注销流程是怎样的?税务清算、清税证明怎么一步步做 | 全流程通俗解读 - 欢欢在创业
  • STM32F103C8T6驱动HDC1080温湿度传感器:手把手教你写软件I2C代码(附完整工程)
  • 2026 济宁厨卫屋面地下室漏水瓷砖空鼓测评:吉修匠 99.8 分五星榜首 - 吉修匠