Wie vereinfache ich eine Topologie zur Erhaltung des Leitungsnetzwerks?

9

Ich habe ein Shapefile (bestehend aus europäischen Hauptstraßen) mit ungefähr 250.000 Segmenten, die ich für das Pgrouting vereinfachen muss. Aber ich kann anscheinend keinen Weg finden, das richtig zu machen.

So sieht es aus:

http://i.stack.imgur.com/qJ2OJ.png

und so sollte es aussehen:

http://i.stack.imgur.com/FN4Z6.png

Ich muss irgendwie jeden Punkt der Linien entfernen, der mit weniger als 3 Linien verbunden ist (kein Schnittpunkt), während die topologischen Verbindungen zwischen den verbleibenden Punkten erhalten bleiben. Wenn jemand eine Idee hat, wäre es sehr dankbar!

Freundliche Grüße

BEARBEITEN: Ich habe versucht, die Idee von @dkastl zu implementieren, und es ist mir gelungen, nur die nicht benötigten Knoten (Knoten mit nur 2 benachbarten Linestrings) mit dem folgenden Code aus meinem Netzwerk zu holen (Netzwerkgenerierung aus dem Blog von underdark http://underdark.wordpress.com) / 2011/02/07 / a-Anfänger-Leitfaden-zum-pgrouting / ):

SELECT * FROM
   (SELECT tmp.id as gid, node.the_geom FROM 
     (SELECT id, count(*) FROM network 
     JOIN node 
     ON (start_id = id OR end_id = id) AND (end_id = id OR start_id = id)
     GROUP BY id ORDER BY id) as tmp
   JOIN node ON (tmp.id = node.id)
   WHERE tmp.count = 2) as unn_node;

Jetzt muss ich nur noch die Linien zusammenführen. Ich habe jedoch keine Ahnung wie. Ich stelle mir vor, es muss eine Schleife sein, die für jede Zeile des Ergebnisses der obigen Abfrage die benachbarten Zeilen erhält und sie zusammenführt. Dann würde das Netzwerk vollständig neu aufgebaut und der Vorgang wiederholt, bis die obige Abfrage ein leeres Ergebnis zurückgibt.

chriserik
quelle
1
Warum müssen Sie dies für pgRouting tun? Wenn Ihnen bereits eine Quell- / Ziel-ID zugewiesen wurde, können Sie eine neue Geometrie erstellen, wobei Linestrings nur Quell- und Ziel-ID enthalten. Das sollte wie dein zweites Bild aussehen.
dkastl
Das Problem ist, dass die Linien segmentiert sind (wenn Sie sich das erste Bild ansehen, das ich gepostet habe, jeder Punkt, den Sie sehen, beginnt / endet ein neues Segment), Ihr Ansatz vereinfacht die Geometrie (was gut ist), aber nicht die Topologie.
Chrisiserik
1
Ich glaube nicht, dass aus Ihrem Bild ersichtlich ist, dass jeder Punkt eine neue Linestring-Geometrie beginnt. Haben Sie bereits die Funktion assign_vertex_id von pgRouting ausgeführt, um Quell- / Zielspalten zu füllen? In diesem Fall können Sie später einige Abfragen durchführen, um nur zweimal vorhandene Quell- / Ziel-IDs zu identifizieren. Dies bedeutet, dass Sie die beiden Liniensegmente an dieser Stelle zusammenführen können sollten. Falls die Quell- / Ziel-ID mehr als zweimal vorhanden ist, muss es sich um eine Kreuzung handeln.
dkastl
@dkastl: Eine sehr gute Idee! Ich habe meine Frage aktualisiert und gezeigt, wie weit ich damit gekommen bin.
Chriserik

Antworten: