第 9 章。拓扑

目录

PostGIS 拓扑类型和函数用于管理拓扑对象,如面、边和节点。

Sandro Santilli 在 2011 年巴黎 PostGIS 日会议上的演讲很好地概述了 PostGIS 拓扑及其发展方向 PostGIS 2.0 幻灯片中的拓扑

Vincent Picavet 在 PostGIS 拓扑 PGConf EU 2012 中对拓扑是什么、如何使用它以及支持它的各种 FOSS4G 工具进行了很好的概述和总结。

基于拓扑的 GIS 数据库的一个例子是 美国人口普查拓扑集成地理编码和参考系统 (TIGER) 数据库。如果您想尝试使用 PostGIS 拓扑并需要一些数据,请查看 Topology_Load_Tiger

PostGIS 拓扑模块在以前版本的 PostGIS 中就已存在,但从未成为 PostGIS 官方文档的一部分。在 PostGIS 2.0.0 中,正在进行大规模清理,以删除其中所有已弃用的函数的使用,修复已知的可用性问题,更好地记录功能和函数,添加新函数,并增强以更符合 SQL-MM 标准。

该项目的详细信息可以在 PostGIS 拓扑 Wiki 中找到。

与此模块关联的所有函数和表都安装在名为 topology 的模式中。

在 SQL/MM 标准中定义的函数以 ST_ 为前缀,而 PostGIS 特有的函数没有前缀。

从 PostGIS 2.0 开始,默认情况下构建拓扑支持,并且可以在构建时指定 --without-topology 配置选项来禁用它,如 第 2 章,PostGIS 安装 中所述

9.1. 拓扑类型

摘要

本节列出了 PostGIS 拓扑安装的 PostgreSQL 数据类型。请注意,我们描述了它们的转换行为,这在设计您自己的函数时非常重要。

  • getfaceedges_returntype — 一个复合类型,由一个序列号和一个边号组成。
  • TopoGeometry — 一种表示拓扑定义的几何图形的复合类型。
  • validatetopology_returntype — 一个复合类型,由一个错误消息以及用于表示错误位置的 id1 和 id2 组成。这是 ValidateTopology 的返回类型。

9.2. 拓扑域

摘要

本节列出了 PostGIS 拓扑安装的 PostgreSQL 域。域可以像对象类型一样用作函数或表列的返回对象。域和类型之间的区别在于,域是具有绑定到它的检查约束的现有类型。

  • TopoElement — 一个包含 2 个整数的数组,通常用于标识 TopoGeometry 组件。
  • TopoElementArray — 一个 TopoElement 对象数组。

9.3. 拓扑和拓扑几何管理

摘要

本节列出了用于构建新的拓扑模式、验证拓扑和管理拓扑几何列的拓扑函数

  • AddTopoGeometryColumn — 向现有表添加拓扑几何列,将此新列注册为 topology.layer 中的一个图层,并返回新的 layer_id。
  • RenameTopoGeometryColumn — 重命名拓扑几何列
  • DropTopology — 请谨慎使用:删除拓扑模式并从 topology.topology 表中删除其引用,并从 geometry_columns 表中删除对该模式中表的引用。
  • RenameTopology — 重命名拓扑
  • DropTopoGeometryColumn — 从模式 schema_name 中名为 table_name 的表中删除拓扑几何列,并从 topology.layer 表中取消注册这些列。
  • Populate_Topology_Layer — 通过从拓扑表中读取元数据,向 topology.layer 表添加缺少的条目。
  • TopologySummary — 获取一个拓扑名称,并提供拓扑中对象类型的摘要总数。
  • ValidateTopology — 返回一组 validatetopology_returntype 对象,详细说明拓扑的问题。
  • ValidateTopologyRelation — 返回有关无效拓扑关系记录的信息
  • FindTopology — 通过不同的方式返回拓扑记录。
  • FindLayer — 通过不同的方式返回 topology.layer 记录。

9.4. 拓扑统计管理

摘要

本节讨论拓扑构建期间的数据库统计信息管理。

向拓扑添加元素会触发许多数据库查询,以查找将被分割的现有边,添加节点和更新将与新线段连接的边。因此,拓扑表中的数据统计信息保持最新非常有用。

PostGIS 拓扑填充和编辑功能不会自动更新统计信息,因为在拓扑中的每次更改后都更新统计信息会过于繁琐,因此调用者有责任处理该问题。

[Note]

autovacuum 更新的统计信息对于在 autovacuum 进程完成之前启动的事务将不可见,因此长时间运行的事务将需要自己运行 ANALYZE,才能使用更新后的统计信息。

9.5. 拓扑构造器

摘要

本节介绍用于创建新拓扑的拓扑函数。

  • CreateTopology — 创建一个新的拓扑模式,并在 topology.topology 表中注册它。
  • CopyTopology — 将拓扑(节点、边、面、图层和拓扑几何)的副本复制到新模式中
  • ST_InitTopoGeo — 创建一个新的拓扑模式,并在 topology.topology 表中注册它。
  • ST_CreateTopoGeo — 向给定的空拓扑添加一组几何图形,并返回详细说明成功的消息。
  • TopoGeo_AddPoint — 使用容差将点添加到现有拓扑,并可能分割现有边。
  • TopoGeo_AddLineString — 使用容差将线串添加到现有拓扑,并可能分割现有边/面。
  • TopoGeo_AddPolygon — 使用容差将多边形添加到现有拓扑,并可能分割现有边/面。返回面标识符。
  • TopoGeo_LoadGeometry — 将几何图形加载到现有拓扑中,并根据需要进行捕捉和分割。

9.6. 拓扑编辑器

摘要

本节介绍用于添加、移动、删除和分割边、面和节点的拓扑函数。所有这些函数均由 ISO SQL/MM 定义。

  • ST_AddIsoNode — 将隔离的节点添加到拓扑中的一个面,并返回新节点的 nodeid。如果面为 null,则仍会创建节点。
  • ST_AddIsoEdge — 将由几何图形 alinestring 定义的隔离边添加到拓扑,连接两个现有的隔离节点 anodeanothernode,并返回新边的边 id。
  • ST_AddEdgeNewFaces — 添加新边,如果在添加时分割了一个面,则删除原始面并将其替换为两个新面。
  • ST_AddEdgeModFace — 添加新边,如果在添加时分割了一个面,则修改原始面并添加一个新面。
  • ST_RemEdgeNewFace — 删除一个边,如果删除的边分隔了两个面,则删除原始面并将其替换为一个新面。
  • ST_RemEdgeModFace — 删除一个边,如果该边分隔了两个面,则删除一个面并修改另一个面以覆盖两个面的空间。
  • ST_ChangeEdgeGeom — 在不影响拓扑结构的情况下更改边的形状。
  • ST_ModEdgeSplit — 通过在现有边上创建一个新节点来分割边,修改原始边并添加新边。
  • ST_ModEdgeHeal — 通过删除连接它们的节点来修复两条边,修改第一条边并删除第二条边。返回已删除节点的 ID。
  • ST_NewEdgeHeal — 通过删除连接它们的节点来修复两条边,删除两条边,并用一条方向与提供的第一条边相同的边替换它们。
  • ST_MoveIsoNode — 将拓扑中的孤立节点从一个点移动到另一个点。如果新的 apoint 几何图形作为节点存在,则会抛出错误。返回移动的描述。
  • ST_NewEdgesSplit — 通过在现有边上创建一个新节点来分割边,删除原始边并用两条新边替换它。返回连接新边的所创建的新节点的 ID。
  • ST_RemoveIsoNode — 删除孤立节点并返回操作描述。如果该节点不是孤立的(是边的起点或终点),则会抛出异常。
  • ST_RemoveIsoEdge — 删除孤立边并返回操作描述。如果该边不是孤立的,则会抛出异常。

9.7. 拓扑访问器

9.8. 拓扑处理

摘要

本节介绍以非标准方式处理拓扑的函数。

  • Polygonize — 查找并注册由拓扑边定义的所有面。
  • AddNode — 将一个点节点添加到指定拓扑模式的节点表中,并返回新节点的 nodeid。如果点已经作为节点存在,则返回现有的 nodeid。
  • AddEdge — 将一个线串边添加到边表中,并将关联的起点和终点添加到指定拓扑模式的点节点表中,使用指定的线串几何图形并返回新边(或现有边)的 edgeid。
  • AddFace — 将面基元注册到拓扑并获取其标识符。
  • ST_Simplify — 使用 Douglas-Peucker 算法返回给定 TopoGeometry 的“简化”几何图形版本。
  • RemoveUnusedPrimitives — 删除定义现有 TopoGeometry 对象不需要的拓扑基元。

9.9. TopoGeometry 构造函数

摘要

本节介绍用于创建新拓扑几何图形的拓扑函数。

  • CreateTopoGeom — 从拓扑元素数组创建一个新的拓扑几何对象 - tg_type:1:[多]点,2:[多]线,3:[多]多边形,4:集合
  • toTopoGeom — 将简单几何图形转换为拓扑几何图形。
  • TopoElementArray_Agg — 为一组 element_id、类型数组 (topoelements) 返回一个 topoelementarray
  • TopoElement — 将拓扑几何图形转换为拓扑元素。

9.10. TopoGeometry 编辑器

摘要

本节介绍用于编辑现有拓扑几何图形的拓扑函数。

9.11. TopoGeometry 访问器

  • GetTopoGeomElementArray — 返回一个 topoelementarray(拓扑元素数组),其中包含给定 TopoGeometry 的拓扑元素和类型(原始元素)。
  • GetTopoGeomElements — 返回一组 topoelement 对象,其中包含给定 TopoGeometry 的拓扑 element_id、element_type(原始元素)。
  • ST_SRID — 返回拓扑几何图形的空间参考标识符。

9.12. TopoGeometry 输出

  • AsGML — 返回拓扑几何图形的 GML 表示形式。
  • AsTopoJSON — 返回拓扑几何图形的 TopoJSON 表示形式。

9.13. 拓扑空间关系

摘要

本节列出了用于检查拓扑几何图形和拓扑基元之间关系的拓扑函数

  • Equals — 如果两个拓扑几何图形由相同的拓扑基元组成,则返回 true。
  • Intersects — 如果两个拓扑几何图形中的任何一对基元相交,则返回 true。

9.14. 导入和导出拓扑

创建拓扑,并可能关联拓扑图层后,您可能希望将其导出为基于文件的格式,以便备份或传输到另一个数据库。

使用 PostgreSQL 的标准转储/恢复工具存在问题,因为拓扑由一组表(4 个用于基元,任意数量用于图层)和元数据表(topology.topology 和 topology.layer)中的记录组成。此外,拓扑标识符在数据库之间不是唯一的,因此您的拓扑的参数在恢复时需要更改。

为了简化拓扑的导出/恢复,提供了一对可执行文件:pgtopo_exportpgtopo_import。用法示例

pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db

9.14.1. 使用拓扑导出器

pgtopo_export 脚本接受数据库和拓扑的名称,并输出一个转储文件,该文件可用于将拓扑(和关联的图层)导入到新数据库中。

默认情况下,pgtopo_export 将转储文件写入标准输出,以便可以将其管道传输到 pgtopo_import 或重定向到文件(拒绝写入终端)。您可以选择使用 -f 命令行开关指定输出文件名。

默认情况下,pgtopo_export 包括针对给定拓扑定义的所有图层的转储。这可能比您需要的更多数据,或者可能是无法工作的(如果您的图层表具有复杂的依赖关系),在这种情况下,您可以使用 --skip-layers 开关请求跳过图层并单独处理这些图层。

使用 --help(或简称 -h)开关调用 pgtopo_export 将始终打印简短的用法字符串。

转储文件格式是一个压缩的 tar 存档,其中包含一个 pgtopo_export 目录,该目录至少包含一个带有格式版本信息的 pgtopo_dump_version 文件。截至版本 1,该目录包含制表符分隔的 CSV 文件,其中包含拓扑基元表(节点、边数据、面、关系)的数据、与之关联的拓扑和图层记录,以及(除非给出 --skip-layers)以自定义格式转储的报告为给定拓扑图层的表。PostgreSQL 转储。

9.14.2. 使用拓扑导入器

pgtopo_import 脚本接受 pgtopo_export 格式的拓扑转储,以及要创建的拓扑的名称,并输出一个 SQL 脚本,该脚本重建拓扑和关联的图层。

生成的 SQL 文件将包含创建具有给定名称的拓扑的语句,在其中加载原始数据,恢复和注册所有拓扑图层,从而将所有 TopoGeometry 值正确链接到其正确的拓扑。

默认情况下,pgtopo_import 从标准输入读取转储,以便可以与管道中的 pgtopo_export 一起使用。您可以选择使用 -f 命令行开关指定输入文件名。

默认情况下,pgtopo_import 在输出 SQL 文件中包含恢复转储中找到的所有图层的代码。

如果您的目标数据库中已经有与转储中名称相同的表,则这可能是不需要的或无法工作的。在这种情况下,您可以使用 --skip-layers 开关请求跳过图层并单独处理这些图层(或稍后处理)。

可以使用 --only-layers 开关生成仅加载图层并将图层链接到命名拓扑的 SQL。这对于在解决命名冲突后加载图层,或将图层链接到不同的拓扑(例如,起始拓扑的空间简化版本)可能很有用。