Chapter 8. Topologie

Table of Contents
8.1. Topologische Datentypen
8.2. Topologische Domänen
8.3. Verwaltung von Topologie und TopoGeometry
8.4. Topology Statistics Management
8.5. Topologie Konstruktoren
8.6. Topologie Editoren
8.7. Zugriffsfunktionen zur Topologie
8.8. Topologie Verarbeitung
8.9. TopoGeometry Konstruktoren
8.10. TopoGeometry Editoren
8.11. TopoGeometry Accessors
8.12. TopoGeometry Ausgabe
8.13. Räumliche Beziehungen einer Topologie
8.14. Importing and exporting Topologies
8.14.1. Using the Topology exporter
8.14.2. Using the Topology importer

Die topologischen Datentypen und Funktionen von PostGIS werden für die Verwaltung von topologischen Objekten wie Maschen, Kanten und Knoten verwendet.

Sandro Santilli's Vortrag auf der Tagung "PostGIS Day Paris 2011" liefert eine gute Übersicht über die PostGIS Topologie und deren Perspektiven Topology with PostGIS 2.0 slide deck.

Vincent Picavet provides a good synopsis and overview of what is Topology, how is it used, and various FOSS4G tools that support it in PostGIS Topology PGConf EU 2012.

Ein Beispiel für eine topologische Geodatenbank ist die US Census Topologically Integrated Geographic Encoding and Referencing System (TIGER) Datenbank. Zum Experimentieren mit der PostGIS Topologie stehen unter Topology_Load_Tiger Daten zur Verfügung.

Das PostGIS Modul "Topologie" gab es auch schon in früheren Versionen von PostGIS, es war aber nie Teil der offiziellen PostGIS Dokumentation. In PostGIS 2.0.0 fand eine umfangreiche Überarbeitung statt, um überholte Funktionen zu entfernen, bekannte Probleme mit der Bedienbarkeit zu bereinigen, bessere Dokumentation der Funktionalität, Einführung neuer Funktionen, und eine bessere Übereinstimmung mit den SQL-MM Normen zu erreichen.

Genauere Angaben zu diesem Projekt finden sich unter PostGIS Topology Wiki

Alle Funktionen und Tabellen, die zu diesem Modul gehören, sind im Schema mit der Bezeichnung topology installiert.

Funktionen die im SQL/MM Standard definiert sind erhalten das Präfix ST_, PostGIS eigene Funktionen erhalten kein Präfix.

Ab PostGIS 2.0 wird die Topologie Unterstützung standardmäßig mitkompiliert und kann bei der Konfiguration mittels der Konfigurationsoption "--without-topology", wie in Chapter 2, PostGIS Installation beschrieben, deaktiviert werden.

8.1. Topologische Datentypen

Abstract

Dieser Abschnitt beschreibt die PostgreSQL Datentypen die mit der PostGIS Topologie installiert werden. Besonders wichtig ist deren Verhaltensweise bei der Typumwandlung, insbesonderen wenn Sie Ihre eigenen Funktionen schreiben.

getfaceedges_returntype — A composite type that consists of a sequence number and an edge number.
TopoGeometry — Ein zusammengesetzter Typ, der eine topologisch festgelegte Geometrie darstellt.
validatetopology_returntype — Ein zusammengesetzter Datentyp, der aus einer Fehlermeldung und id1 und id2 besteht. id1 und id2 deuten auf die Stelle hin, an der der Fehler auftrat. Dies ist der von ValidateTopology zurückgegebene Datentyp.

8.2. Topologische Domänen

Abstract

Dieser Abschnitt beschreibt die PostgreSQL Domänen/domains die von PostGIS Topology installiert werden. Domänen können, ähnlich wie Objekttypen, als Rückgabeobjekte von Funktionen oder als Tabellenspalten verwendet werden. Der Unterschied zwischen einer Domäne und einem Datentyp ist, dass eine Domäne ein bestehender Datentyp mit einer an diesen gebundenen Check-Constraint ist.

TopoElement — Ein Feld mit 2 Ganzzahlen, welches in der Regel für die Auffindung einer Komponente einer TopoGeometry dient.
TopoElementArray — Ein Feld mit TopoElement Objekten.

8.3. Verwaltung von Topologie und TopoGeometry

Abstract

Dieser Abschnitt beschreibt die topologischen Funktionen zum Erstellen von neuen topologischen Schemata, zum Validieren von Topologien und zur Verwaltung von TopoGeometry Attributen

AddTopoGeometryColumn — Fügt ein TopoGeometry Attribut an eine bestehende Tabelle an, registriert dieses neue Attribut als einen Layer in topology.layer und gibt die neue layer_id zurück.
RenameTopoGeometryColumn — Renames a topogeometry column
DropTopology — Bitte mit Vorsicht verwenden: Löscht ein topologisches Schema und dessen Referenz in der Tabelle topology.topology, sowie die Referenzen zu den Tabellen in diesem Schema aus der Tabelle geometry_columns.
RenameTopology — Renames a topology
DropTopoGeometryColumn — Entfernt ein TopoGeometry-Attribut aus der Tabelle mit der Bezeichnung table_name im Schema schema_name und entfernt die Registrierung der Attribute aus der Tabelle "topology.layer".
Populate_Topology_Layer — Fügt fehlende Einträge zu der Tabelle topology.layer hinzu, indem Metadaten aus den topologischen Tabellen ausgelesen werden.
TopologySummary — Nimmt den Namen einer Topologie und liefert eine Zusammenfassung der Gesamtsummen der Typen und Objekte in der Topologie.
ValidateTopology — Liefert eine Menge validatetopology_returntype Objekte, die Probleme mit der Topologie beschreiben.
ValidateTopologyRelation — Returns info about invalid topology relation records
FindTopology — Returns a topology record by different means.
FindLayer — Returns a topology.layer record by different means.

8.4. Topology Statistics Management

Abstract

This section discusses management of database statistics during topology building.

Adding elements to a topology triggers many database queries for finding existing edges that will be split, adding nodes and updating edges that will node with the new linework. For this reason it is useful that statistics about the data in the topology tables are up-to-date.

PostGIS Topology population and editing functions do not automatically update the statistics because a updating stats after each and every change in a topology would be overkill, so it is the caller's duty to take care of that.

[Note]

That the statistics updated by autovacuum will NOT be visible to transactions which started before autovacuum process completed, so long-running transactions will need to run ANALYZE themselves, to use updated statistics.

8.5. Topologie Konstruktoren

Abstract

Dieser Abschnitt behandelt Funktionen zum Erzeugen neuer Topologien.

CreateTopology — Creates a new topology schema and registers it in the topology.topology table.
CopyTopology — Makes a copy of a topology (nodes, edges, faces, layers and TopoGeometries) into a new schema
ST_InitTopoGeo — Creates a new topology schema and registers it in the topology.topology table.
ST_CreateTopoGeo — Fügt eine Sammlung von Geometrien an eine leere Topologie an und gibt eine Bestätigungsmeldung aus.
TopoGeo_AddPoint — Fügt einen Punkt, unter Berücksichtigung einer Toleranz, an eine bestehende Topologie an. Existierende Kanten werden eventuell aufgetrennt.
TopoGeo_AddLineString — Fügt einen Linienzug, unter Berücksichtigung einer Toleranz, an eine bestehende Topologie an. Existierende Kanten/Maschen werden eventuell aufgetrennt. Gibt den Identifikator der Kante aus.
TopoGeo_AddPolygon — Fügt ein Polygon, unter Berücksichtigung einer Toleranz, an eine bestehende Topologie an. Existierende Kanten/Maschen werden eventuell aufgetrennt. Gibt den Identifikator der Masche zurück.

8.6. Topologie Editoren

Abstract

Dieser Abschnitt behandelt topologische Funktionen zum Hinzufügen, Verschieben, Löschen und Teilen von Kanten, Maschen und Knoten. Sämtliche dieser Funktionen sind über die ISO SQL/MM definiert.

ST_AddIsoNode — Fügt einen isolierten Knoten zu einer Masche in einer Topologie hinzu und gibt die "nodeid" des neuen Knotens aus. Falls die Masche NULL ist, wird der Knoten dennoch erstellt.
ST_AddIsoEdge — Fügt eine isolierte Kante, die durch die Geometrie alinestring festgelegt wird zu einer Topologie hinzu, indem zwei bestehende isolierte Knoten anode und anothernode verbunden werden. Gibt die "edgeid" der neuen Kante aus.
ST_AddEdgeNewFaces — Fügt eine Kante hinzu. Falls dabei eine Masche aufgetrennt wird, so wird die ursprüngliche Masche gelöscht und durch zwei neue Maschen ersetzt.
ST_AddEdgeModFace — Fügt eine Kante hinzu. Falls dabei eine Masche aufgetrennt wird, so wird die ursprüngliche Masche angepasst und eine weitere Masche hinzugefügt.
ST_RemEdgeNewFace — Entfernt eine Kante. Falls die gelöschte Kante zwei Maschen voneinander getrennt hat, werden die ursprünglichen Maschen gelöscht und durch einer neuen Masche ersetzt.
ST_RemEdgeModFace — Removes an edge, and if the edge separates two faces deletes one face and modifies the other face to cover the space of both.
ST_ChangeEdgeGeom — Ändert die geometrische Form einer Kante, ohne sich auf die topologische Struktur auszuwirken.
ST_ModEdgeSplit — Trennt eine Kante auf, indem ein neuer Knoten entlang einer bestehenden Kante erstellt wird. Ändert die ursprüngliche Kante und fügt eine neue Kante hinzu.
ST_ModEdgeHeal — "Heilt" zwei Kanten, indem der verbindende Knoten gelöscht wird, die erste Kante modifiziert und die zweite Kante gelöscht wird. Gibt die ID des gelöschten Knoten zurück.
ST_NewEdgeHeal — "Heilt" zwei Kanten, indem der verbindende Knoten und beide Kanten gelöscht werden. Die beiden Kanten werden durch eine Kante ersetzt, welche dieselbe Ausichtung wie die erste Kante hat.
ST_MoveIsoNode — Verschiebt einen isolierten Knoten in einer Topologie von einer Stelle an eine andere. Falls die neue Geometrie apoint bereits als Knoten existiert, wird eine Fehlermeldung ausgegeben. Gibt eine Beschreibung der Verschiebung aus.
ST_NewEdgesSplit — Trennt eine Kante auf, indem ein neuer Knoten entlang einer bestehenden Kante erstellt, die ursprüngliche Kante gelöscht und durch zwei neue Kanten ersetzt wird. Gibt die ID des neu erstellten Knotens aus, der die neuen Kanten verbindet.
ST_RemoveIsoNode — Löscht einen isolierten Knoten und gibt eine Beschreibung der getroffenen Maßnahmen aus. Falls der Knoten nicht isoliert ist (ist der Anfangs- oder der Endpunkt einer Kante), wird eine Fehlermeldung ausgegeben.
ST_RemoveIsoEdge — Löscht einen isolierten Knoten und gibt eine Beschreibung der getroffenen Maßnahmen aus. Falls der Knoten nicht isoliert ist, wird eine Fehlermeldung ausgegeben.

8.7. Zugriffsfunktionen zur Topologie

GetEdgeByPoint — Findet die edge-id einer Kante die einen gegebenen Punkt schneidet.
GetFaceByPoint — Finds face intersecting a given point.
GetFaceContainingPoint — Finds the face containing a point.
GetNodeByPoint — Findet zu der Lage eines Punktes die node-id eines Knotens.
GetTopologyID — Gibt für den Namen einer Topologie die ID der Topologie in der Tabelle "topology.topology" aus.
GetTopologySRID — Gibt für den Namen einer Topologie, die SRID der Topologie in der Tabelle "topology.topology" aus.
GetTopologyName — Gibt für die ID der Topologie, den Namen der Topologie (Schema) zurück.
ST_GetFaceEdges — Gibt die Kanten, die aface begrenzen, sortiert aus.
ST_GetFaceGeometry — Gibt für eine Topologie und eine bestimmte Maschen-ID das Polygon zurück.
GetRingEdges — Gibt eine sortierte Liste von mit Vorzeichen versehenen Identifikatoren der Kanten zurück, die angetroffen werden, wenn man an der Seite der gegebenen Kante entlangwandert.
GetNodeEdges — Gibt für einen Knoten die sortierte Menge der einfallenden Kanten aus.

8.8. Topologie Verarbeitung

Abstract

Dieser Abschnitt behandelt Funktionen zur Verarbeitung von Topologien mit nicht standardmäßigen Methoden.

Polygonize — Findet und registriert alle Maschen, die durch die Kanten der Topologie festgelegt sind.
AddNode — Fügt einen Knotenpunkt zu der Tabelle "node" in dem vorgegebenen topologischen Schema hinzu und gibt die "nodeid" des neuen Knotens aus. Falls der Punkt bereits als Knoten existiert, wird die vorhandene nodeid zurückgegben.
AddEdge — Fügt die Kante eines Linienzugs in der Tabelle "edge", und die zugehörigen Anfangs- und Endpunkte in die Knotenpunkttabelle, des jeweiligen topologischen Schemas ein. Dabei wird die übergebene Linienzuggeometrie verwendet und die edgeid der neuen (oder bestehenden) Kante ausgegeben.
AddFace — Registriert die Elementarstruktur einer Masche in einer Topologie und gibt den Identifikator der Masche aus.
ST_Simplify — Gibt für eine TopoGeometry eine "vereinfachte" geometrische Version zurück. Verwendet den Douglas-Peucker Algorithmus.
RemoveUnusedPrimitives — Removes topology primitives which not needed to define existing TopoGeometry objects.

8.9. TopoGeometry Konstruktoren

Abstract

Dieser Abschnitt behandelt topologische Funktionen zur Erstellung einer neuen TopoGeometry.

CreateTopoGeom — Erzeugt ein neues topologisch geometrisches Objekt aus einem Feld mit topologischen Elementen - tg_type: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection
toTopoGeom — Wandelt eine einfache Geometrie in eine TopoGeometry um.
TopoElementArray_Agg — Gibt für eine Menge an element_id, type Feldern (topoelements) ein topoelementarray zurück.
TopoElement — Converts a topogeometry to a topoelement.

8.10. TopoGeometry Editoren

Abstract

Dieser Abschnitt behandelt topologische Funktionen zur Bearbeitung einer bestehenden TopoGeometry.

clearTopoGeom — Löscht den Inhalt einer TopoGeometry.
TopoGeom_addElement — Fügt ein Element zu der Definition einer TopoGeometry hinzu.
TopoGeom_remElement — Entfernt ein Element aus der Definition einer TopoGeometry.
TopoGeom_addTopoGeom — Adds element of a TopoGeometry to the definition of another TopoGeometry.
toTopoGeom — Fügt eine Geometrie zu einer bestehenden TopoGeometry hinzu.

8.11. TopoGeometry Accessors

GetTopoGeomElementArray — Gibt ein topoelementarray (ein Feld von topoelements) zurück, das die topologischen Elemente und den Datentyp der gegebenen TopoGeometry (die Elementarstrukturen) enthält.
GetTopoGeomElements — Gibt für eine TopoGeometry (Elementarstrukturen) einen Satz an topoelement Objekten zurück, welche die topologische element_id und den element_type beinhalten.
ST_SRID — Returns the spatial reference identifier for a topogeometry.

8.12. TopoGeometry Ausgabe

AsGML — Gibt die GML-Darstellung einer TopoGeometry zurück.
AsTopoJSON — Gibt die TopoJSON-Darstellung einer TopoGeometry zurück.

8.13. Räumliche Beziehungen einer Topologie

Abstract

Dieser Abschnitt behandelt topologische Funktionen zur Überprüfung der Beziehungen von TopoGeometry Objekten und topologischen Elementarstrukturen

Equals — Gibt TRUE zurück, wenn zwei TopoGeometry Objekte aus denselben topologischen Elementarstrukturen bestehen.
Intersects — Gibt TRUE zurück, wenn sich kein beliebiges Paar von Elemtarstrukturen zweier TopoGeometry Objekte überschneidet.

8.14. Importing and exporting Topologies

Once you have created topologies, and maybe associated topological layers, you might want to export them into a file-based format for backup or transfer into another database.

Using the standard dump/restore tools of PostgreSQL is problematic because topologies are composed by a set of tables (4 for primitives, an arbitrary number for layers) and records in metadata tables (topology.topology and topology.layer). Additionally, topology identifiers are not univoque across databases so that parameter of your topology will need to be changes upon restoring it.

In order to simplify export/restore of topologies a pair of executables are provided: pgtopo_export and pgtopo_import. Example usage:

pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db

8.14.1. Using the Topology exporter

The pgtopo_export script takes the name of a database and a topology and outputs a dump file which can be used to import the topology (and associated layers) into a new database.

By default pgtopo_export writes the dump file to the standard output so that it can be piped to pgtopo_import or redirected to a file (refusing to write to terminal). You can optionally specify an output filename with the -f commandline switch.

By default pgtopo_export includes a dump of all layers defined against the given topology. This may be more data than you need, or may be non-working (in case your layer tables have complex dependencies) in which case you can request skipping the layers with the --skip-layers switch and deal with those separately.

Invoking pgtopo_export with the --help (or -h for short) switch will always print short usage string.

The dump file format is a compressed tar archive of a pgtopo_export directory containing at least a pgtopo_dump_version file with format version info. As of version 1 the directory contains tab-delimited CSV files with data of the topology primitive tables (node, edge_data, face, relation), the topology and layer records associated with it and (unless --skip-layers is given) a custom-format PostgreSQL dump of tables reported as being layers of the given topology.

8.14.2. Using the Topology importer

The pgtopo_import script takes a pgtopo_export format topology dump and a name to give to the topology to be created and outputs an SQL script reconstructing the topology and associated layers.

The generated SQL file will contain statements that create a topology with the given name, load primitive data in it, restores and registers all topology layers by properly linking all TopoGeometry values to their correct topology.

By default pgtopo_import reads the dump from the standard input so that it can be used in conjuction with pgtopo_export in a pipeline. You can optionally specify an input filename with the -f commandline switch.

By default pgtopo_import includes in the output SQL file the code to restore all layers found in the dump.

This may be unwanted or non-working in case your target database already have tables with the same name as the ones in the dump. In that case you can request skipping the layers with the --skip-layers switch and deal with those separately (or later).

SQL to only load and link layers to a named topology can be generated using the --only-layers switch. This can be useful to load layers AFTER resolving the naming conflicts or to link layers to a different topology (say a spatially-simplified version of the starting topology).