PostGIS Topology

Z GeoWikiCZ

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

CREATE SCHEMA my_schema;
SET search_path TO my_schema,public;

Feature table 'kraje'

CREATE TABLE kraje AS SELECT nuts3, st_multi(st_union(geom)) as geom FROM gis1.obce GROUP BY nuts3;
SELECT nuts3,st_geometrytype(geom) AS type, ROUND(st_area(geom)/1e6) AS area from kraje;
 nuts3 |      type       | area  
-------+-----------------+-------
 CZ042 | ST_MultiPolygon |  5341
 CZ081 | ST_MultiPolygon |  5566
 CZ053 | ST_MultiPolygon |  4523
 CZ032 | ST_MultiPolygon |  7566
 CZ041 | ST_MultiPolygon |  3317
 CZ071 | ST_MultiPolygon |  5141
 CZ061 | ST_MultiPolygon |  6924
 CZ051 | ST_MultiPolygon |  3163
 CZ062 | ST_MultiPolygon |  7065
 CZ021 | ST_MultiPolygon | 11013
 CZ072 | ST_MultiPolygon |  3961
 CZ031 | ST_MultiPolygon | 10071
 CZ052 | ST_MultiPolygon |  4767
 CZ011 | ST_MultiPolygon |   496
(14 rows)

Vytvoření topologického schématu 'urbanarea'

SELECT topology.createtopology('urbanarea', 3358);
SELECT * from topology.topology;
 id |   name    | srid | precision | hasz 
----+-----------+------+-----------+------
  1 | urbanarea | 3358 |         0 | f
\dt urbanarea.
           List of relations
  Schema   |   Name    | Type  | Owner  
-----------+-----------+-------+--------
 urbanarea | edge_data | table | martin
 urbanarea | face      | table | martin
 urbanarea | node      | table | martin
 urbanarea | relation  | table | martin
\d urbanarea.node
                                          Table "urbanarea.node"
     Column      |         Type         |                            Modifiers                             
-----------------+----------------------+------------------------------------------------------------------
 node_id         | integer              | not null default nextval('urbanarea.node_node_id_seq'::regclass)
 containing_face | integer              | 
 geom            | geometry(Point,3358) | 
Indexes:
    "node_primary_key" PRIMARY KEY, btree (node_id)
    "node_gist" gist (geom)
Foreign-key constraints:
    "face_exists" FOREIGN KEY (containing_face) REFERENCES urbanarea.face(face_id)
Referenced by:
    TABLE "urbanarea.edge_data" CONSTRAINT "end_node_exists" FOREIGN KEY (end_node) REFERENCES urbanarea.node(node_id)
    TABLE "urbanarea.edge_data" CONSTRAINT "start_node_exists" FOREIGN KEY (start_node) REFERENCES urbanarea.node(node_id)
\d urbanarea.edge_data
                                               Table "urbanarea.edge_data"
       Column        |           Type            |                               Modifiers                               
---------------------+---------------------------+-----------------------------------------------------------------------
 edge_id             | integer                   | not null default nextval('urbanarea.edge_data_edge_id_seq'::regclass)
 start_node          | integer                   | not null
 end_node            | integer                   | not null
 next_left_edge      | integer                   | not null
 abs_next_left_edge  | integer                   | not null
 next_right_edge     | integer                   | not null
 abs_next_right_edge | integer                   | not null
 left_face           | integer                   | not null
 right_face          | integer                   | not null
 geom                | geometry(LineString,3358) | 
Indexes:
    "edge_data_pkey" PRIMARY KEY, btree (edge_id)
    "edge_gist" gist (geom)
    "edge_left_face_idx" btree (left_face)
    "edge_right_face_idx" btree (right_face)
Foreign-key constraints:
    "end_node_exists" FOREIGN KEY (end_node) REFERENCES urbanarea.node(node_id)
    "left_face_exists" FOREIGN KEY (left_face) REFERENCES urbanarea.face(face_id)
    "next_left_edge_exists" FOREIGN KEY (abs_next_left_edge) REFERENCES urbanarea.edge_data(edge_id) DEFERRABLE INITIALLY DEFERRED
    "next_right_edge_exists" FOREIGN KEY (abs_next_right_edge) REFERENCES urbanarea.edge_data(edge_id) DEFERRABLE INITIALLY DEFERRED
    "right_face_exists" FOREIGN KEY (right_face) REFERENCES urbanarea.face(face_id)
    "start_node_exists" FOREIGN KEY (start_node) REFERENCES urbanarea.node(node_id)
Referenced by:
    TABLE "urbanarea.edge_data" CONSTRAINT "next_left_edge_exists" FOREIGN KEY (abs_next_left_edge) REFERENCES urbanarea.edge_data(edge_id) DEFERRABLE INITIALLY DEFERRED
    TABLE "urbanarea.edge_data" CONSTRAINT "next_right_edge_exists" FOREIGN KEY (abs_next_right_edge) REFERENCES urbanarea.edge_data(edge_id) DEFERRABLE INITIALLY DEFERRED
\d urbanarea.face
                                       Table "urbanarea.face"
 Column  |          Type          |                            Modifiers                             
---------+------------------------+------------------------------------------------------------------
 face_id | integer                | not null default nextval('urbanarea.face_face_id_seq'::regclass)
 mbr     | geometry(Polygon,3358) | 
Indexes:
    "face_primary_key" PRIMARY KEY, btree (face_id)
    "face_gist" gist (mbr)
Referenced by:
    TABLE "urbanarea.node" CONSTRAINT "face_exists" FOREIGN KEY (containing_face) REFERENCES urbanarea.face(face_id)
    TABLE "urbanarea.edge_data" CONSTRAINT "left_face_exists" FOREIGN KEY (left_face) REFERENCES urbanarea.face(face_id)
    TABLE "urbanarea.edge_data" CONSTRAINT "right_face_exists" FOREIGN KEY (right_face) REFERENCES urbanarea.face(face_id)
\d urbanarea.relation
     Table "urbanarea.relation"
    Column    |  Type   | Modifiers 
--------------+---------+-----------
 topogeo_id   | integer | not null
 layer_id     | integer | not null
 element_id   | integer | not null
 element_type | integer | not null
Indexes:
    "relation_layer_id_key" UNIQUE, btree (layer_id, topogeo_id, element_id, element_type)
Triggers:
    relation_integrity_checks BEFORE INSERT OR UPDATE ON urbanarea.relation FOR EACH ROW EXECUTE PROCEDURE relationtrigger('2', 'urbanarea')

Přidání atributu topologie do feature table

select topology.AddTopoGeometryColumn('urbanarea', 'my_schema', 'urbanarea', 'topo', 'POLYGON');
\d urbanarea

...
 topo         | topology.topogeometry | 
...
SELECT * FROM topology.layer;
 topology_id | layer_id | schema_name | table_name | feature_column | feature_type | level | child_id 
-------------+----------+-------------+------------+----------------+--------------+-------+----------
           1 |        1 | my_schema   | urbanarea  | topo           |            3 |     0 |         

Poznámka: feature_type '3' odpovídá 'face' (1 - node, 2 - edge).

Sestavení topologie (Geometry → TopoGeometry)

Externí odkazy