Je veux créer un réseau routier à utiliser avec pgRouting en utilisant les données OpenStreetMap. J'ai chargé un fichier de formes de GeoFabrik dans une table Postgres (avec PostGIS activé). Cependant, un problème que j'ai eu est que les routes ne s'arrêtent pas toujours aux intersections, j'ai donc décidé de les diviser toutes à chaque intersection ou passage.
Pour identifier toutes les intersections où les routes se croisaient ou se croisaient, j'ai utilisé ce qui suit SQL
(semblable à une question précédente ):
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);
Je veux maintenant diviser les routes en utilisant ces points. J'ai utilisé l'approche suivante:
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);
Le problème avec cette approche partagée est que la longueur totale de la route reste en plus de toutes les pièces séparées. Pour supprimer ces géométries de route non séparées qui ont été incluses, j'ai utilisé la ST_Equals()
fonction pour les identifier et les supprimer:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
Cependant, cette approche ne supprime pas toutes les géométries non divisées d'origine (bien qu'elle en supprime certaines). Existe-t-il une meilleure approche pour la suppression (ou globale) afin que je n'ai que les géométries divisées dans une table?
.geom
-vous? Je ne le vois pas!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.
Réponses:
Pas une vraie solution à votre problème, mais essayez osm2po ... cela crée un code SQL parfait pour le routage en pgrouting: http://osm2po.de/
la source
osm2pgrouting
mais cela nécessite plus de mémoire que mon serveur et il se termine sans terminer.osm2po
c'était une faute de frappe. Est-il facile de l'installer dans Ubuntu?Réponse simple: non. Vous ne devriez pas le faire de cette façon.
À partir des fichiers de formes de route OSM, il est impossible de faire la distinction entre les intersections et les passages supérieurs / inférieurs. Vous créerez des intersections qui n'existent pas dans la réalité si vous divisez toutes les routes qui semblent se croiser.
Vous devrez vous salir les mains avec le fichier OSM d'origine, si vous ne souhaitez pas utiliser les outils existants tels que osm2pgrouting (où le réseau est suffisamment petit) ou osm2po.
la source
À propos de votre problème général, en utilisant pgRouting: Je pense que @Uffer, @GisStudent et d'autres qui montrent comment utiliser "OSC & etc.", ils ont raison. Suivez les indices des "meilleures pratiques" et des "normes" ...
À propos de votre question: "diviser les routes en segments individuels aux intersections" ou "comment supprimer toutes les géométries non divisées d'origine". Je peux vous aider si vous montrez ici vos résultats ici, étape par étape ...
Première étape: l'analyse de la topologie
la source
Une autre "solution pas vraiment à votre problème", mais notre convertisseur OSM se divise aux intersections pendant qu'il convertit d'OSM en SHP. Il est plus efficace de cette façon, car il peut comparer l'ID des nœuds, plutôt que de faire des calculs géométriques.
la source
Une façon de le résoudre de manière algorithmique serait d'ajouter le point de départ et le point d'arrivée de chaque route entière à l'ensemble des «intersections», de sorte que vous puissiez être certain que chaque segment se trouve entre deux intersections.
la source