¿Cómo dividir las carreteras OSM en segmentos individuales en las intersecciones?


10

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?


Según la documentación, ST_Split no devuelve la geometría original no dividida. ¿Qué es ese '.geom' extra que cuelga en el último paréntesis de cierre en la primera línea de su declaración SELECT? Podría ser tan simple como eliminar eso.
Scro

@Scro, ¿a qué .geomte refieres? No puedo verlo!
djq

Supongo que técnicamente, esa sería la segunda línea de la instrucción SELECT. También me refiero a la creación de la tabla "split_roads". Es la línea que termina con '))). Geom) como geom'.
Scro

hmm, me sale un error cuando hago eso. 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.
djq

¿La línea completa se veía así: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, blade.geom)))) Como geom,
Scro

Respuestas:


6

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/


Gracias por la sugerencia. Lo he intentado osm2pgroutingpero requiere más memoria que mi servidor y termina sin terminar.
djq

2
@djq osm2po puede manejar archivos mucho más grandes que osm2pgrouting. Incluso puede cargar planet.osm
underdark

Ah, originalmente pensé que osm2poera un error tipográfico. ¿Hay una forma sencilla de instalarlo en ubuntu?
djq

Es un archivo JAR compilado listo (Java). Simplemente ejecútelo como se explica en el sitio web.
Estudiante SIG

11

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.


1
Exactamente . Este es también otro error que algunas personas hacen cuando procesan datos de navteq y teleatlas. Los pasos subterráneos son un dolor pero una realidad.
Ragi Yaser Burhum

1
De acuerdo. Bienvenido a GIS donde los datos son siempre más o menos malos
simplexio

3

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

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

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.


1

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.