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.