Topologische Zusammenhänge mit PostGIS erkennen

16

Ich versuche mit PostGIS eine grundlegende Typologieanalyse durchzuführen. Mein Ziel ist es, alle Polygone zu finden, die andere Polygone berühren. Um dies zu tun, dachte ich, das ST_GetFaceEdgeswürde funktionieren ( Referenz ). Ich möchte jedes Polygon in meiner Datenbank überprüfen und alle anderen Polygone auflisten, die es berühren. Im Bild unten würde ich erwarten, dass das Ergebnis besagt, dass zwei der Polygone (die Gebäude sind) ein Gebäude berühren, und die Ergebnisse der anderen 4 besagen, dass sie 0 Polygone berühren.

Bildbeschreibung hier eingeben

Ich habe jedoch einige Schwierigkeiten zu verstehen, was zu tun ist. Als ich versuchte, das Beispiel zu kopieren, gab es einige Teile davon, die ich nicht verstand.

-- Returns the sequence, edge id
-- , and geometry of the edges that bound face 1
-- If you just need geom and seq, can use ST_GetFaceGeometry
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Ich bin nicht sicher, ob topologyder Name einer Tabelle, Spalte oder ein Teil der Funktion ist. Ich nahm an, dass es der Tisch war, aber ich bin mir nicht sicher.

-- try out on sample of data
-- Table is called 'TestArea', column used is 'fid_1'
SELECT t.seq, t.edge, geom
FROM  TestArea.ST_GetFaceEdges('fid_1', 1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Ich bin mir auch nicht sicher, welche Funktion der innere Join hat. Verbindet dieser das Ergebnis mit dem ursprünglichen Objekt?

djq
quelle
4
Ich weiß, dass underdark dies mit ihren charakteristisch klaren Diagrammen beantwortet hat, aber ich bin mir nicht sicher, ob Ihre Polygone in erster Linie topologisch verwandt sind. Die Topologie impliziert in diesem Fall eine logische Beziehung zwischen Entitäten, die von ihrer visuellen Darstellung getrennt ist, und erfordert (in PostGIS) das Einrichten eines Schemas mit CreateTopologyusw. ( bit.ly/oLk8QY ). Aber die Art und Weise, wie Ihre Gebäude digitalisiert werden, ist für mich von Bedeutung als ob sie trotz der visuellen Nähe ihrer Ränder topologisch verschieden wären. Nur etwas, auf das zukünftige Fragesteller achten sollten.
MerseyViking
Würde dies bedeuten, dass ich AddTopoGeometryColumnder Tabelle ein hinzufügen muss , bevor die Abfrage ausgeführt wird? Basierend auf den Ergebnissen ST_Touchesder überprüften Werte ergab alles Sinn, aber vielleicht war das Zufall.
Dienstag,
1
Sie müssen nicht nur anrufen AddTopoGeometryColumn, sondern Ihre Daten müssen auch topologisch konsistent digitalisiert werden. Normalerweise digitalisieren Sie beispielsweise zwei Doppelhaushälften als zwei Polygone und verwenden die Option "An Scheitelpunkt ausrichten" in Ihrem GIS, um die gemeinsame Wandberührung sicherzustellen. Sie werden jedoch als zwei übereinstimmende Linien mit übereinstimmenden Punkten an jedem Ende gespeichert. Die topologische Digitalisierung bedeutet jedoch, dass die gemeinsam genutzte Wand nur eine Linie und zwei Knoten umfasst, die von jedem Polygon gemeinsam genutzt werden. ST_TouchesEs wird lediglich eine räumliche Überprüfung auf Nähe durchgeführt, keine topologische.
MerseyViking

Antworten:

19

Sie könnten stattdessen ST_Touches verwenden:

ST_Touches - Gibt TRUE zurück, wenn die Geometrien mindestens einen Punkt gemeinsam haben, ihre Innenräume sich jedoch nicht schneiden.

ST_Touches liefert TRUE für zB

Bildbeschreibung hier eingeben

Das Abrufen der Zähler sollte in etwa so funktionieren:

SELECT a.id, count(*)
FROM polygon_table as a
JOIN polygon_table as b
  ON ST_Touches(a.the_geom,b.the_geom)
GROUP BY a.id
Underdunkel
quelle
Ich bin daran interessiert zu wissen, wie viele Polygone jedes Polygon berührt. Ansonsten ist es perfekt und ich habe es zum Laufen gebracht!
22.
1
Ich habe gerade festgestellt, dass es für jeden Fall einen True / False-Wert zurückgibt. Alles, was ich tun muss, ist zu zählen, wie viele True-Werte vorhanden sind. Vielen Dank!
22.
5
Eine mögliche Zählabfrage wurde hinzugefügt.
underdark