postgis_topology
PostGIS 拓扑空间类型和函数
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
postgis | 3.6.2 | GIS | GPL-2.0 | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 1500 | postgis | 否 | 是 | 否 | 是 | 否 | 否 | - |
| 1501 | postgis_topology | 否 | 是 | 否 | 是 | 否 | 否 | topology |
| 1502 | postgis_raster | 否 | 是 | 否 | 是 | 否 | 否 | - |
| 1503 | postgis_sfcgal | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 1504 | postgis_tiger_geocoder | 否 | 是 | 否 | 是 | 是 | 否 | tiger |
| 1505 | address_standardizer | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 1506 | address_standardizer_data_us | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | postgis pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 3.6.2 | 1817161514 | postgis | postgis |
| RPM | PGDG | 3.6.2 | 1817161514 | postgis36_$v | - |
| DEB | PGDG | 3.6.2 | 1817161514 | postgresql-$v-postgis-3 | - |
| OS / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
| el8.x86_64 | PGDG 3.6.1 | PGDG 3.6.1 | PGDG 3.6.1 | PGDG 3.6.1 | PGDG 3.6.1 |
| el8.aarch64 | PGDG 3.6.1 | PGDG 3.6.1 | PGDG 3.6.1 | PGDG 3.6.1 | PGDG 3.6.1 |
| el9.x86_64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| el9.aarch64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| el10.x86_64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| el10.aarch64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| d12.x86_64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| d12.aarch64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| d13.x86_64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| d13.aarch64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| u22.x86_64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| u22.aarch64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| u24.x86_64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 |
| u24.aarch64 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 3.6.2 | PGDG 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 为 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');