postgis_topology

PostGIS 拓扑空间类型和函数

概览

扩展包名版本分类许可证语言
postgis3.6.2GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展postgis pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.21817161514postgispostgis
RPMPGDG3.6.21817161514postgis36_$v-
DEBPGDG3.6.21817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.1PGDG 3.6.1PGDG 3.6.1PGDG 3.6.1PGDG 3.6.1
el8.aarch64PGDG 3.6.1PGDG 3.6.1PGDG 3.6.1PGDG 3.6.1PGDG 3.6.1
el9.x86_64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
el9.aarch64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
el10.x86_64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
el10.aarch64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
d12.x86_64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
d12.aarch64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
d13.x86_64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
d13.aarch64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
u22.x86_64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
u22.aarch64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
u24.x86_64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2
u24.aarch64PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2PGDG 3.6.2

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION postgis_topology CASCADE;  -- 依赖: postgis

用法

PostGIS Topology:PostGIS 的拓扑数据模型支持

PostGIS Topology 为 PostgreSQL 实现了 SQL/MM 拓扑模型。它将空间数据表示为节点、边和面的图结构,确保共享边界只存储一次,并强制保证几何一致性。

安装

CREATE EXTENSION postgis_topology;

这将创建包含管理表和函数的 topology 模式。


创建拓扑

拓扑是一个具有指定 SRID 和捕捉容差的命名模式:

-- 创建名为 'city_topo' 的拓扑,SRID 4326,容差 0.00001 度
SELECT topology.CreateTopology('city_topo', 4326, 0.00001);

列出所有拓扑:

SELECT * FROM topology.topology;

构建拓扑基元

添加边

边是基本构建单元。节点会在边的端点处自动创建。

-- 添加孤立节点
SELECT topology.ST_AddIsoNode('city_topo', NULL, ST_Point(-73.98, 40.75));

-- 添加两点之间的边(如需要会自动创建节点)
SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.99, 40.74), ST_Point(-73.98, 40.74)));

SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.98, 40.74), ST_Point(-73.98, 40.75)));

SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.98, 40.75), ST_Point(-73.99, 40.75)));

SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.99, 40.75), ST_Point(-73.99, 40.74)));

查看基元

-- 列出节点
SELECT node_id, ST_AsText(geom) FROM city_topo.node;

-- 列出边
SELECT edge_id, ST_AsText(geom) FROM city_topo.edge_data;

-- 列出面(face_id 0 是全局面)
SELECT face_id, ST_AsText(mbr) FROM city_topo.face;

-- 获取面的几何形状
SELECT topology.ST_GetFaceGeometry('city_topo', 1);

拓扑几何(TopoGeometry)

拓扑几何是通过引用拓扑基元而非坐标来定义的空间对象。这确保了共享边界始终保持一致。

创建拓扑几何图层

-- 创建包含拓扑几何列的表
CREATE TABLE city_topo.blocks (
    id serial PRIMARY KEY,
    name text
);

-- 注册拓扑几何列(返回 layer_id)
SELECT topology.AddTopoGeometryColumn('city_topo', 'city_topo', 'blocks', 'topo', 'POLYGON');

赋值拓扑几何

-- 从常规几何创建拓扑几何(捕捉到已有拓扑)
INSERT INTO city_topo.blocks (name, topo) VALUES
    ('Block A', topology.toTopoGeom(
        ST_GeomFromText('POLYGON((-73.99 40.74,-73.98 40.74,-73.98 40.75,-73.99 40.75,-73.99 40.74))', 4326),
        'city_topo', 1));

-- 将拓扑几何转换回常规几何
SELECT name, topo::geometry FROM city_topo.blocks;

验证拓扑

-- 验证整个拓扑
SELECT * FROM topology.ValidateTopology('city_topo');

-- 检查拓扑错误
SELECT error FROM topology.ValidateTopology('city_topo')
WHERE error IS NOT NULL;

清理

-- 删除拓扑及其所有对象
SELECT topology.DropTopology('city_topo');

最后修改 2026-03-12: update extension pages (f579993)