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.
Respuestas:
No es una solución real a su problema, pero intente con osm2po ... crea un código SQL perfecto para el enrutamiento en pgrouting: http://osm2po.de/
fuente
osm2pgrouting
pero requiere más memoria que mi servidor y termina sin terminar.osm2po
era un error tipográfico. ¿Hay una forma sencilla de instalarlo en ubuntu?Respuesta simple: no lo hagas. No deberías hacerlo de esa manera.
Desde los archivos de forma de la carretera OSM, es imposible distinguir entre intersecciones y pasos superiores / inferiores. Creará intersecciones que no existen en realidad si divide todos los caminos que aparentemente cruzan.
Tendrá que ensuciarse las manos con el archivo OSM original, si no desea utilizar herramientas existentes como osm2pgrouting (donde la red es lo suficientemente pequeña) u osm2po.
fuente
Sobre su problema general, usando pgRouting: creo que @Uffer, @GisStudent y otros que muestran cómo usar "OSC & etc.", tienen razón. Siga las pistas de "mejores prácticas" y "estándares" ...
Acerca de su pregunta: "dividir las carreteras en segmentos individuales en las intersecciones" o "cómo eliminar todas las geometrías originales sin dividir". Puedo ayudarlo si muestra aquí sus resultados aquí, paso a paso ...
Primer paso: análisis de topología
fuente
Otra "solución no real a su problema", pero nuestro convertidor OSM se divide en las intersecciones mientras se convierte de OSM a SHP. Es más eficiente de esa manera, ya que puede comparar la ID de los nodos, en lugar de hacer cálculos geométricos.
fuente
Una forma de resolverlo algorítmicamente sería agregar el punto inicial y final de cada camino completo al conjunto de "intersecciones", de modo que pueda estar seguro de que cada segmento está entre dos intersecciones.
fuente