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?
.geom
beziehen Sie sich? Kann es nicht erkennen!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.
Antworten:
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/
quelle
osm2pgrouting
aber es benötigt mehr Speicher als mein Server und es wird ohne Abschluss beendet.osm2po
sei ein Tippfehler. Gibt es eine einfache Möglichkeit, es in Ubuntu zu installieren?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.
quelle
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
quelle
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.
quelle
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.
quelle