Chapter 9. Topologie

Table of Contents

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 gibt in PostGIS Topology PGConf EU 2012 einen guten Überblick darüber, was Topologie ist, wie sie verwendet wird und welche FOSS4G-Tools sie unterstützen.

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.

9.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 — Ein zusammengesetzter Typ, der aus einer Sequenznummer und einer Randnummer besteht.
  • 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.

9.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.

9.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 — Benennt eine topogeometrische Spalte um
  • 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 — Benennt eine Topologie um
  • 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 — Gibt Informationen über ungültige Topologiebeziehungssätze zurück
  • FindTopology — Gibt einen Topologie-Datensatz mit anderen Mitteln zurück.
  • FindLayer — Gibt einen topology.layer-Datensatz mit anderen Mitteln zurück.

9.4. Verwaltung der Topologie-Statistiken

Abstract

In diesem Abschnitt wird die Verwaltung der Datenbankstatistiken während der Topologieerstellung behandelt.

Das Hinzufügen von Elementen zu einer Topologie löst viele Datenbankabfragen aus, um bestehende Kanten zu finden, die geteilt werden, Knoten hinzuzufügen und Kanten zu aktualisieren, die mit dem neuen Liniennetz verknotet werden. Aus diesem Grund ist es sinnvoll, dass die Statistiken über die Daten in den Topologietabellen aktuell sind.

Die PostGIS-Topologiebevölkerungs- und -bearbeitungsfunktionen aktualisieren die Statistiken nicht automatisch, da eine Aktualisierung der Statistiken nach jeder einzelnen Änderung in einer Topologie zu viel Aufwand wäre.

[Note]

Die von Autovacuum aktualisierten Statistiken sind für Transaktionen, die vor Beendigung des Autovacuum-Prozesses gestartet wurden, NICHT sichtbar, so dass lang laufende Transaktionen selbst ANALYZE ausführen müssen, um aktualisierte Statistiken zu verwenden.

9.5. Topologie Konstruktoren

Abstract

Dieser Abschnitt behandelt Funktionen zum Erzeugen neuer Topologien.

  • CreateTopology — Erstellt ein neues Topologie-Schema und trägt es in die Tabelle topology.topology ein.
  • CopyTopology — Erstellt eine Kopie einer Topologie (Knoten, Kanten, Flächen, Ebenen und TopoGeometrien) in ein neues Schema
  • ST_InitTopoGeo — Erstellt ein neues Topologie-Schema und trägt es in die Tabelle topology.topology ein.
  • 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.

9.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 — Entfernt eine Kante, und wenn die Kante zwei Flächen trennt, wird eine Fläche gelöscht und die andere Fläche so verändert, dass sie den Raum beider Flächen abdeckt.
  • 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.

9.7. Zugriffsfunktionen zur Topologie

  • GetEdgeByPoint — Findet die edge-id einer Kante die einen gegebenen Punkt schneidet.
  • GetFaceByPoint — Findet eine Fläche, die einen bestimmten Punkt schneidet.
  • GetFaceContainingPoint — Findet die Fläche, die einen Punkt enthält.
  • 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.

9.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 — Entfernt Topologieprimitive, die zur Definition bestehender TopoGeometry-Objekte nicht benötigt werden.

9.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 — Konvertiert eine Topogeometrie in ein Topoelement.

9.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 — Fügt Element einer TopoGeometry zur Definition einer anderen TopoGeometry hinzu.
  • toTopoGeom — Fügt eine Geometrie zu einer bestehenden TopoGeometry hinzu.

9.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 — Gibt den räumlichen Referenzbezeichner für eine Topogeometrie zurück.

9.12. TopoGeometry Ausgabe

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

9.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.

9.14. Importieren und Exportieren von Topologien

Nachdem Sie Topologien und eventuell zugehörige topologische Ebenen erstellt haben, möchten Sie diese vielleicht in ein dateibasiertes Format exportieren, um sie zu sichern oder in eine andere Datenbank zu übertragen.

Die Verwendung der Standard-Dump/Restore-Tools von PostgreSQL ist problematisch, da Topologien aus einer Reihe von Tabellen (4 für Primitive, eine beliebige Anzahl für Layer) und Datensätzen in Metadatentabellen (topology.topology und topology.layer) bestehen. Außerdem sind die Topologiebezeichner nicht datenbankübergreifend einheitlich, so dass die Parameter Ihrer Topologie bei der Wiederherstellung geändert werden müssen.

Um das Exportieren/Wiederherstellen von Topologien zu vereinfachen, werden zwei ausführbare Dateien bereitgestellt: pgtopo_export und pgtopo_import. Beispiel für die Verwendung:

pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db

9.14.1. Verwendung des Topologie-Exporters

Das Skript pgtopo_export nimmt den Namen einer Datenbank und eine Topologie und gibt eine Dump-Datei aus, die zum Importieren der Topologie (und der zugehörigen Ebenen) in eine neue Datenbank verwendet werden kann.

Standardmäßig schreibt pgtopo_export die Speicherauszugsdatei in die Standardausgabe, so dass sie an pgtopo_import weitergeleitet oder in eine Datei umgeleitet werden kann (Ablehnung des Schreibens ins Terminal). Sie können optional einen Ausgabedateinamen mit der Befehlszeilenoption -f angeben.

Standardmäßig enthält pgtopo_export einen Speicherauszug aller für die angegebene Topologie definierten Ebenen. Dies können mehr Daten sein, als Sie benötigen, oder sie können nicht funktionieren (falls Ihre Ebenentabellen komplexe Abhängigkeiten haben). In diesem Fall können Sie mit dem Schalter --skip-layers verlangen, dass die Ebenen übersprungen werden, und diese separat behandeln.

Der Aufruf von pgtopo_export mit dem Schalter --help (oder kurz -h ) gibt immer einen kurzen Verwendungsstring aus.

Das Format der Dump-Datei ist ein komprimiertes tar-Archiv eines pgtopo_export Verzeichnisses, das mindestens eine pgtopo_dump_version Datei mit Informationen zur Formatversion enthält. Ab Version 1 enthält das Verzeichnis tabulatorgetrennte CSV-Dateien mit den Daten der Topologie-Primitivtabellen (node, edge_data, face, relation), den damit verbundenen Topologie- und Ebenendatensätzen und (sofern nicht --skip-layers angegeben ist) einem PostgreSQL-Dump im benutzerdefinierten Format der Tabellen, die als Ebenen der angegebenen Topologie gemeldet werden.

9.14.2. Verwendung des Topologie-Importers

Das Skript pgtopo_import nimmt einen Topologie-Dump im Format pgtopo_export und einen Namen für die zu erstellende Topologie und gibt ein SQL-Skript aus, das die Topologie und die zugehörigen Ebenen rekonstruiert.

Die generierte SQL-Datei enthält Anweisungen, die eine Topologie mit dem angegebenen Namen erstellen, Primitivdaten in sie laden, alle Topologieebenen wiederherstellen und registrieren, indem sie alle TopoGeometry-Werte ordnungsgemäß mit der richtigen Topologie verknüpfen.

Standardmäßig liest pgtopo_import den Speicherauszug von der Standardeingabe, so dass er in Verbindung mit pgtopo_export in einer Pipeline verwendet werden kann. Sie können optional einen Eingabedateinamen mit der Befehlszeilenoption -f angeben.

Standardmäßig enthält pgtopo_import in der SQL-Ausgabedatei den Code zur Wiederherstellung aller im Dump gefundenen Ebenen.

Dies kann unerwünscht sein oder nicht funktionieren, wenn Ihre Zieldatenbank bereits Tabellen mit dem gleichen Namen wie die im Dump hat. In diesem Fall können Sie das Überspringen der Ebenen mit dem Schalter --skip-layers anfordern und diese separat (oder später) bearbeiten.

SQL, um nur Ebenen zu laden und mit einer benannten Topologie zu verknüpfen, kann mit dem Schalter --only-layers erzeugt werden. Dies kann nützlich sein, um Ebenen zu laden, NACHDEM die Benennungskonflikte gelöst wurden, oder um Ebenen mit einer anderen Topologie zu verknüpfen (z. B. einer räumlich vereinfachten Version der Ausgangstopologie).