Ich versuche zu identifizieren, wo sich Straßen kreuzen, und einen Punkt an dieser Kreuzung zu machen, wobei die Anzahl der Straßen, die die Kreuzung bilden, aufgelistet wird.
Ich habe mich gefragt, ob es eine Möglichkeit gibt, ST_NumPoints zu verwenden, um dies zu erreichen, aber ich kann nicht genau herausfinden, was ich tun soll. Ich habe eine Punktetabelle erstellt, in der sich die Linien mit dem folgenden Code schneiden:
CREATE TABLE test_points as
SELECT
ST_Intersection(a.geom, b.geom),
a.gid
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom);
Wenn ich dies auf einem Beispiel von Straßen laufen lasse, erhalte ich das folgende Punktraster (die Straßen werden zur Veranschaulichung gezeigt):
Wenn ich einen der Punkte inspiziere, sehe ich, dass viele Punkte übereinander gestapelt sind:
Die GID ist hier der Straßenausweis, aber ich verstehe nicht, warum es so viele Punkte gibt. Ich kann verstehen, dass 4 Punkte für eine zentrale Straßenkreuzung gezählt werden, aber hier sind 12 Punkte aufgeführt. Gibt es eine bessere Möglichkeit, diese Berechnung in PostGIS durchzuführen?
COUNT()
wieCOUNT(ST_Touches(..))
und,COUNT(ST_Intersection(..))
aber dies scheint nicht zu funktionieren, wie alle Werte sind12
.Das ist ein bisschen kniffliger als Sie vielleicht erwarten. Das liegt daran, dass es keine gute Möglichkeit gibt, Beziehungen für mehr als Paare zu analysieren. Sie können nicht drei Zeilen in eine Funktion einfügen und fragen, ob sich alle überschneiden.
Mindestens ein Ansatz könnte jedoch darin bestehen, zuerst die Kreuzungen zu finden und dann zu überprüfen, wie viele Straßen sich an jeder Kreuzung berühren (dies kann alles in derselben Abfrage erfolgen).
Wenn Ihre Straßen perfekt miteinander verbunden sind und es keine Straßen gibt, die an einer Kreuzung vorbeiführen, können Sie Folgendes tun (nicht getestet):
Mit vergessener Gruppenklausel bearbeitet (immer noch nicht getestet):
Wenn die Straßen nicht richtig verbunden sind und / oder einige Straßen an einer Kreuzung vorbeifahren, ist dies komplizierter.
HTH
Nicklas
quelle
distinct_crosspoints ,roads
durch meinen Tabellennamen (roads_test
) ersetzen ? Das habe ich versucht, aber dann ist mir der Fehler unterlaufen, dassgeom
ich mehrdeutig bin.Wenn die Linie A (ID 1) die Linie B (ID 2) kreuzt, ist dies ein Schnittpunkt, den wir benötigen. Die Linie B kreuzt jedoch auch die Linie A an derselben Stelle. Diesen Punkt brauchen wir aber nicht zweimal. Deshalb benutze ich
a.gid < b.gid
statta.gid != b.gid
quelle