第 8 章。拓扑

目录
8.1. 拓扑类型
8.2. 拓扑域
8.3. 拓扑和 TopoGeometry 管理
8.4. 拓扑统计管理
8.5. 拓扑构造器
8.6. 拓扑编辑器
8.7. 拓扑访问器
8.8. 拓扑处理
8.9. TopoGeometry 构造器
8.10. TopoGeometry 编辑器
8.11. TopoGeometry 访问器
8.12. TopoGeometry 输出
8.13. 拓扑空间关系
8.14. 导入和导出拓扑
8.14.1. 使用拓扑导出器
8.14.2. 使用拓扑导入器

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 拓扑维基

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

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

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

8.1. 拓扑类型

摘要

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

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

8.2. 拓扑域

摘要

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

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

8.3. 拓扑和 TopoGeometry 管理

摘要

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

AddTopoGeometryColumn — 将拓扑几何列添加到现有表中,将此新列注册为拓扑中的图层,并返回新的图层 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 — 通过不同方式返回拓扑层记录。

8.4. 拓扑统计管理

摘要

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

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

PostGIS 拓扑填充和编辑功能不会自动更新统计信息,因为在拓扑的每次更改后更新统计信息将是过度的,因此由调用者负责处理此问题。

[Note]

自动清理更新的统计信息对在自动清理过程完成之前开始的事务不可见,因此长时间运行的事务需要自己运行 ANALYZE,以使用更新的统计信息。

8.5. 拓扑构造函数

摘要

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

CreateTopology — 创建一个新的拓扑模式并在 topology.topology 表中注册它。
CopyTopology — 将拓扑(节点、边、面、层和 TopoGeometries)复制到新的模式中。
ST_InitTopoGeo — 创建一个新的拓扑模式并在 topology.topology 表中注册它。
ST_CreateTopoGeo — 将几何体集合添加到给定的空拓扑中,并返回详细说明成功的消息。
TopoGeo_AddPoint — 使用容差将点添加到现有拓扑中,并可能分割现有边。
TopoGeo_AddLineString — 使用容差将线字符串添加到现有拓扑中,并可能分割现有边/面。返回边标识符。
TopoGeo_AddPolygon — 使用容差将多边形添加到现有拓扑中,并可能分割现有边/面。返回面标识符。

8.6. 拓扑编辑器

摘要

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

ST_AddIsoNode — 将孤立节点添加到拓扑中的面,并返回新节点的节点 ID。如果面为空,则仍然创建节点。
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 — 删除孤立边并返回操作的描述。 如果边不是孤立的,则会抛出异常。

8.7. 拓扑访问器

GetEdgeByPoint — 查找与给定点相交的边的边 ID。
GetFaceByPoint — 查找与给定点相交的面。
GetFaceContainingPoint — 查找包含给定点的面。
GetNodeByPoint — 查找给定点位置处的节点 ID。
GetTopologyID — 返回给定拓扑名称的 topology.topology 表中拓扑的 ID。
GetTopologySRID — 返回给定拓扑名称的 topology.topology 表中拓扑的 SRID。
GetTopologyName — 返回给定拓扑 ID 的拓扑(模式)名称。
ST_GetFaceEdges — 返回一组有序的边,这些边包围 aface
ST_GetFaceGeometry — 返回给定拓扑中具有指定面 ID 的多边形。
GetRingEdges — 返回在给定边侧行走时遇到的有序集合的有符号边标识符。
GetNodeEdges — 返回与给定节点关联的有序边集。

8.8. 拓扑处理

摘要

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

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

8.9. TopoGeometry 构造函数

摘要

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

CreateTopoGeom — 从拓扑元素数组创建新的拓扑几何对象 - tg_type: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection
toTopoGeom — 将简单几何转换为拓扑几何。
TopoElementArray_Agg — 返回一组 element_id、type 数组(拓扑元素)的 topoelementarray
TopoElement — 将拓扑几何转换为拓扑元素。

8.10. TopoGeometry 编辑器

摘要

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

clearTopoGeom — 清除拓扑几何的内容。
TopoGeom_addElement — 向 TopoGeometry 的定义中添加元素。
TopoGeom_remElement — 从 TopoGeometry 的定义中删除元素。
TopoGeom_addTopoGeom — 将 TopoGeometry 的元素添加到另一个 TopoGeometry 的定义中。
toTopoGeom — 将几何形状添加到现有拓扑几何中。

8.11. TopoGeometry 访问器

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

8.12. 拓扑几何输出

AsGML — 返回拓扑几何的 GML 表示。
AsTopoJSON — 返回拓扑几何的 TopoJSON 表示。

8.13. 拓扑空间关系

摘要

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

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

8.14. 导入和导出拓扑

创建拓扑后,您可能希望将它们导出到基于文件的格式中,以进行备份或传输到另一个数据库。

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

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

pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db

8.14.1. 使用拓扑导出器

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

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

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

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

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

8.14.2. 使用拓扑导入器

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

生成的 SQL 文件将包含创建具有给定名称的拓扑、在其中加载基元数据、恢复和注册所有拓扑图层的语句,方法是将所有 TopoGeometry 值正确链接到其相应的拓扑。

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

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

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

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