Wie kann man OSM-Straßen an Kreuzungen in einzelne Segmente aufteilen?


10

Ich möchte ein Straßennetz zur Verwendung mit pgRouting unter Verwendung von OpenStreetMap-Daten erstellen. Ich habe ein Shapefile von GeoFabrik in eine Postgres-Tabelle geladen (mit aktiviertem PostGIS). Ein Problem, das ich hatte, war jedoch, dass die Straßen nicht immer an Kreuzungen enden. Deshalb habe ich beschlossen, sie alle an jeder Kreuzung oder Kreuzung aufzuteilen.

Um alle Kreuzungen zu identifizieren, an denen sich Straßen kreuzten oder kreuzten, habe ich Folgendes verwendet SQL(ähnlich einer vorherigen Frage):

CREATE TABLE split_points as
SELECT DISTINCT    
   ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom      
FROM
   roads as a,
   roads as b
WHERE
    ST_Touches(a.geom, b.geom)
OR
    ST_Crosses(a.geom, b.geom)    
    AND a.gid != b.gid
GROUP BY
   ST_Intersection(a.geom, b.geom);

Ich möchte jetzt die Straßen mit diesen Punkten teilen. Ich habe den folgenden Ansatz verwendet:

CREATE TABLE split_roads as
SELECT     
    ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
    generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM    
    split_points as blade,
    roads as g
WHERE
    ST_Intersects(g.geom, blade.geom);

Das Problem bei diesem geteilten Ansatz besteht darin, dass die gesamte Straßenlänge zusätzlich zu allen geteilten Teilen erhalten bleibt. Um diese nicht geteilten Straßengeometrien zu entfernen, die enthalten waren, habe ich die ST_Equals()Funktion verwendet, um sie zu identifizieren und zu löschen:

DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)

Bei diesem Ansatz werden jedoch nicht alle ursprünglichen ungeteilten Geometrien entfernt (obwohl einige davon entfernt werden). Gibt es einen besseren Ansatz zum Löschen (oder insgesamt), sodass ich nur die geteilten Geometrien in einer Tabelle habe?


Laut Dokumentation gibt ST_Split nicht die ursprüngliche, nicht geteilte Geometrie zurück. Was ist das zusätzliche '.geom', das in der letzten schließenden Klammer in der ersten Zeile Ihrer SELECT-Anweisung hängt? Könnte so einfach sein, wie das zu entfernen.
Scro

@ Scro, auf was .geombeziehen Sie sich? Kann es nicht erkennen!
DJQ

Ich denke, technisch gesehen wäre das die zweite Zeile der SELECT-Anweisung. Ich beziehe mich auch auf die Tabellenerstellung "split_roads". Es ist die Zeile, die mit '))). Geom) als Geom' endet.
Scro

hmm, ich bekomme einen Fehler, wenn ich das mache. ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
DJQ

Sah die gesamte Zeile so aus: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, Blade.geom)))) Als Geom,
Scro

Antworten:


6

Keine wirkliche Lösung für Ihr Problem, aber versuchen Sie es mit osm2po ... es erstellt perfekten SQL-Code für das Routing in pgrouting: http://osm2po.de/


Danke für den Vorschlag. Ich habe es versucht, osm2pgroutingaber es benötigt mehr Speicher als mein Server und es wird ohne Abschluss beendet.
DJQ

2
@djq osm2po kann viel größere Dateien verarbeiten als osm2pgrouting. Es kann sogar planet.osm laden
underdark

Ah, ich dachte ursprünglich, es osm2posei ein Tippfehler. Gibt es eine einfache Möglichkeit, es in Ubuntu zu installieren?
DJQ

Es ist eine fertig kompilierte JAR-Datei (Java). Führen Sie es einfach wie auf der Website erklärt aus.
GIS Student

11

Einfache Antwort: Nicht. Du solltest es nicht so machen.

Anhand der Shapefiles der OSM-Straße ist es unmöglich, zwischen Kreuzungen und Über- / Unterführungen zu unterscheiden. Sie erstellen Kreuzungen, die in der Realität nicht existieren, wenn Sie alle scheinbar kreuzenden Straßen aufteilen.

Sie müssen sich mit der ursprünglichen OSM-Datei die Hände schmutzig machen, wenn Sie keine vorhandenen Tools wie osm2pgrouting (wo das Netzwerk klein genug ist) oder osm2po verwenden möchten.


1
Genau . Dies ist auch ein weiterer Fehler, den manche Leute machen, wenn sie Navteq- und Teleatlas-Daten verarbeiten. Unterführung / Überführung ist ein Schmerz, aber eine Realität.
Ragi Yaser Burhum

1
Zustimmen. Willkommen bei GIS, wo Daten immer mehr oder weniger schlecht sind
Simplexio

3

Zu Ihrem allgemeinen Problem mit pgRouting: Ich denke, @Uffer, @GisStudent und andere, die zeigen, wie man "OSC & etc." verwendet, haben Recht. Befolgen Sie die Hinweise auf "Best Practices" und "Standards" ...

Zu Ihrer Frage: "Teilen Sie Straßen an Kreuzungen in einzelne Segmente" oder "Entfernen aller ursprünglichen ungeteilten Geometrien". Ich kann Ihnen helfen, wenn Sie hier Schritt für Schritt Ihre Ergebnisse zeigen ...

Erster Schritt: Topologieanalyse

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

Eine weitere "nicht echte Lösung für Ihr Problem", aber unser OSM-Konverter teilt sich an Kreuzungen, während er von OSM zu SHP konvertiert. Auf diese Weise ist es effizienter, da die ID der Knoten verglichen werden kann, anstatt geometrische Berechnungen durchzuführen.


1

Eine Möglichkeit, es algorithmisch zu lösen, besteht darin, den Start- und Endpunkt jeder ganzen Straße zur Menge der "Kreuzungen" hinzuzufügen, sodass Sie sicher sein können, dass sich jedes Segment zwischen zwei Kreuzungen befindet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.