PostGIS Topology
PostGIS Topology je rozšíření pro PostGIS umožňující topologickou správu vektorových dat v prostředí PostGIS/PostgreSQL.
Více přednášky Úvod do zpracování prostorových dat.
Příklad
Data z cvičné databáze pgis_student.
CREATE SCHEMA my_schema;
SET search_path TO my_schema,public,topology,gis1;
Feature table 'tm50_cr'
CREATE TABLE tm50_cr AS SELECT DISTINCT k.ogc_fid,k.tm50,k.geom FROM kltm50 AS k JOIN obce AS o ON ST_Overlaps(k.geom, o.geom);
SELECT COUNT(*) FROM tm50_cr;
count ------- 289 (1 row)

Vytvoření topologického schématu 'topo_tm50_cr'
SELECT topology.createtopology('topo_tm50_cr', find_srid('gis1', 'kltm50', 'geom'), 1);
Argumenty:
- find_srid('gis1', 'kltm50', 'geom') → 2065 (EPSG)
- 1 (přesnost v mapových jednotkách, tj. v tomto případě v metrech)
SELECT * from topology.topology;
id | name | srid | precision | hasz ----+--------------+------+-----------+------ 1 | topo_tm50_cr | 2065 | 1 | f (1 row)
\dt topo_tm50_cr.
List of relations Schema | Name | Type | Owner --------------+-----------+-------+--------- topo_tm50_cr | edge_data | table | postgis topo_tm50_cr | face | table | postgis topo_tm50_cr | node | table | postgis topo_tm50_cr | relation | table | postgis (4 rows)
Přidání atributu topologie do feature table
SELECT topology.AddTopoGeometryColumn('topo_tm50_cr', 'my_schema', 'tm50_cr', 'topo', 'POLYGON');
SELECT * FROM topology.layer;
topology_id | layer_id | schema_name | table_name | feature_column | feature_type | level | child_id -------------+----------+-------------+------------+----------------+--------------+-------+---------- 1 | 1 | my_schema | tm50_cr | topo | 3 | 0 |
Poznámka: feature_type '3' odpovídá 'face' (1 - node, 2 - edge).
Sestavení topologie (Geometry → TopoGeometry)
UPDATE tm50_cr set topo = topology.toTopoGeom(geom, 'tm50_cr', 1);
SELECT tm50,topo from tm50_cr limit 3;
tm50 | topo -----------+------------ M-33-29-D | (1,1,1,3) M-33-30-C | (1,1,2,3) M-33-30-D | (1,1,3,3) (3 rows)
Poznámka:
(1,1,1,3) odpovídá (topology_id,layer_id,id,type)
Počet uzlů:
SELECT count(*) from tm50_cr.node;
count ------- 313 (1 row)
Počet hran:
SELECT count(*) from tm50_cr.edge_data;
count ------- 601 (1 row)
Počet stěn:
SELECT count(*) from tm50_cr.face;
count ------- 290 (1 row)
Hrany, které vedou z anebo do uzlu číslo '164'
SELECT edge_id,left_face,right_face from tm50_cr.edge WHERE start_node = 164 OR end_node = 164;
edge_id | left_face | right_face ---------+-----------+------------ 289 | 146 | 134 310 | 160 | 146 308 | 172 | 134 360 | 172 | 160 (4 rows)
