Ich habe eine Reihe von Postgis-Skripten, die zwei Tabellen erzeugen - eine aus einer Reihe von Punkten und die zweite aus einer Reihe von Straßen, die sie umgeben. Alle Daten befinden sich in der gleichen Projektion und beide Ausgaben werden mit postgis 2.1 in postgres 9.2-Tabellen gespeichert
Die Verfugungstopologie des Straßennetzes wurde erstellt und die Punktetabelle enthält eine Spalte mit dem nächstgelegenen Straßensegment.
Ich möchte dann eine Teilmenge des Straßennetzes generieren, die das kleinste Netzwerk darstellt, das alle Punkte mit einem Minimum Spanning Tree verbindet. Das Straßennetz ist ungerichtet und die Kosten sind einfach die Streckenlänge.
Ich kann dies in QGIS / Grass mit der v.net-Familie von Modulen tun, aber im Idealfall möchte ich diesen letzten Schritt auch in SQL beibehalten.
Ich habe mir die neue apspWarshall-Postgis-Funktion angeschaut, bin aber ratlos darüber, wie sie dazu angeregt werden kann, ihre Energie auf das Verbinden der Punkte und nicht auf das gesamte Netzwerk zu konzentrieren.
Dies ist das kurze Skript, das ich zusammengestellt habe, um ein Framework zur Lösung dieses Problems zu erstellen, aber ich kann nicht erkennen, wo es möglich ist, die Funktion zu fokussieren, um mit einer Teilmenge der Kanten zu beginnen.
SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM pgr_apspWarshall('SELECT gid AS id,
source,
target,
st_length(the_geom) AS cost
FROM road_network
',
false, false
) AS tree
JOIN road_network As roads
ON tree.id2 = roads.gid
Bei Problemen mit einem einzelnen Pfad und kürzesten Pfaden fragt die Funktion nach dem Anfang und dem Ende, aber anscheinend nicht bei allen Punktproblemen. Ebenso erwarten der v.net.spanningtree und der v.net.steiner in Grass eine Reihe von Punkten und Linien als ein kombiniertes Netzwerk, mit dem gearbeitet werden kann.
Hat jemand einen Vorschlag, wie das in PostGIS geht?
Antworten:
Diese Antwort ist nicht vollständig oder getestet, aber versuchen Sie es so:
laut fragen / 39210 :
Ich denke, das ist nicht sehr effizient.
quelle
@Adrian, ich bin mit den Ergebnissen der Verfugung wirklich nicht vertraut, aber die Dokumentation ist sehr detailliert. Meine Antwort basiert auf einer zweistufigen Funktion, die in SQL sehr unzulänglich ist, aber [wahrscheinlich] die Ergebnisse liefert. Diese [ungetestete] Lösung optimiert NICHT den besten Ausgangspunkt, sondern reduziert das gesamte Streckennetz auf die Kanten, die alle Haltestellen verbinden, und führt dann effizient zu allen Haltestellen.
Schritt 1 (Unterauswahl einer Straßennetz-Teilmenge, die alle Haltestellen verbindet) Mit dieser Routing-Funktion werden mehrere Pfade (K Dijkstr-Pfad) zurückgegeben, die (bei Kosten <> -1) tatsächlich alle Ihre Pfade verbinden hört auf.
Schritt 2 (endgültige Auswahl der Mindestpfade auf der Grundlage der oben genannten Teilmenge der Straßennetzpfade, die alle Haltestellen verbinden) Dies ist im Wesentlichen das, womit Sie begonnen haben, aber ich schlage vor, dass Sie Ihr Straßennetz mit dem anfänglichen Ergebnis auf id1 (Pfad) gleich verbinden. so dass nur die Teilmenge der Straßen im endgültigen Field-Warshal-Routing verwendet wird :
Fazit: Die innere Routing-Abfrage k_dijkstra_path reduziert das gesamte Straßennetz auf die Pfade, die alle Haltestellen verbinden, und die äußere Routing-Abfrage fField_Warshal verwendet nur diese Kanten-IDs, um die Abfrage zur Pfadoptimierung zu lösen.
quelle