Quiero crear una red de carreteras para usar con pgRouting utilizando datos de OpenStreetMap. Cargué un archivo shape de GeoFabrik en una tabla de Postgres (con PostGIS habilitado). Sin embargo, un problema que tuve fue que los caminos no siempre terminan en las intersecciones, así que decidí dividirlos en cada intersección o cruce.
Para identificar todas las intersecciones donde las carreteras se cruzaban o intersectaban, utilicé lo siguiente SQL
(similar a una pregunta anterior ):
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);
Ahora quiero dividir las carreteras con estos puntos. Utilicé el siguiente enfoque:
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);
El problema con este enfoque dividido es que la longitud total del camino permanece además de todas las piezas divididas. Para eliminar estas geometrías de carreteras sin dividir que se incluyeron, utilicé la ST_Equals()
función para identificarlas y eliminarlas:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
Sin embargo, este enfoque no elimina todas las geometrías originales sin dividir (aunque elimina algunas de ellas). ¿Existe un mejor enfoque para la eliminación (o en general) para que solo tenga las geometrías divididas en una tabla?
.geom
te refieres? No puedo verlo!
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.