¿Cuál es una forma eficiente de detectar cruces de carreteras en un mapa?

14

Puedo recibir mapas de cualquier fuente para mi proyecto, y para el algoritmo de C ++ que estoy creando, es imperativo que el algoritmo sepa dónde están las uniones de carreteras (nodos donde se encuentran más de dos segmentos de carreteras). Además, en muchos de los mapas que obtengo, hay carreteras que se sobrepasan y no se pueden conectar (es decir, las carreteras no están conectadas correctamente). Una forma de corregir el problema es "limpiando" la red de carreteras con Autocad. Las preguntas que tengo son:

  1. ¿Hay una manera eficiente (cualquier software que puede hacerlo?) para obtener mi mapa en un formato GML, que contiene información sobre enlaces de carreteras en ¿el mapa? (tal vez tenga una etiqueta GML que dice que un nodo en particular es un cruce)
  2. ¿Hay alguna otra manera de 'limpiar'? la red de carreteras?

Los colegas han sugerido FME, pero eso implica escribir guiones y no estamos seguros de si el guión sería lo suficientemente flexible como para atender a todos los mapas. La única otra forma de detectar uniones es usar la fuerza bruta y encontrar qué segmentos de la carretera tienen nodos comunes. ¿ArcGIS ayudaría? (no lo he usado, pero he oído hablar de él) Estoy seguro de que debería haber una mejor manera ...

    
pregunta Nav 08.12.2010 - 09:32

6 respuestas

9

Si tiene los caminos en una forma espacial, como un Shapefile, puede cargarlos en PostGIS y hacer que encuentren automáticamente aquellos que utilizan una consulta SQL. He hecho esto antes: la declaración SQL está diseñada para encontrar para cada camino aquellas que se intersectan geográficamente y crear un punto nodal para cada cruce.

Intentaré limpiar esto más tarde, pero aquí está el flujo básico que puedes tomar ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Las funciones ST_ * son las que hacen que esto funcione dentro de PostGIS

  • ST_Envelope : Agarra el cuadro delimitador de una geometría determinada: esto se utiliza para acelerar el algoritmo. Uno puede restringir una búsqueda geográfica con los cuadros delimitadores en un pase rápido pero menos preciso y luego escanear los resultados con las geometrías reales.
  • ST_Intersects : determina si dos geometrías se intersecan
  • ST_Intersection : devuelve la intersección de dos geometrías

Los siguientes son solo fragmentos de código, ya que no tengo tiempo de terminar, quizás alguien pueda editarlo antes de que regrese aquí ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id
    
respondido por el dmsnell 08.12.2010 - 13:21
11

Puedes analizar las polilíneas de maneras asombrosas usando buffers. Esto suele ser ineficiente: los búferes crean muchos vértices adicionales, pero (a) es una técnica disponible en muchos SIG (basados en vectores o ráster) y (b) a veces puede producir información que, de otro modo, sería difícil de obtener.

En este caso, amortiguar el camino con una pequeña cantidad y luego amortiguar con el negativo de la misma cantidad deja pequeñas "islas" alrededor de todas las curvas y alrededor de todas las intersecciones. Esto es fácil de probar geométricamente.

Este es un ejemplo de un búfer de polilínea de 10 m (gris) y su búfer de -10 m (rojo claro) en un mapa de 650 m de ancho:

Ahoraintersecalacapadepolilíneaoriginalconestospolígonosdeisla,combinalossegmentosporidentificadordeislaycuentalaspiezas:

Los segmentos de color amarillo claro designan las piezas de recuento alto y los segmentos cian oscuros designan los segmentos de recuento bajo. De esta manera, hemos (a) encontrado todas las curvas e intersecciones (incluidas las auto-intersecciones) y las uniones cercanas (consulte el extremo izquierdo, donde los dos segmentos no se encuentran) y (b) diferenciados Las curvas de las intersecciones. Podemos encontrar las casi uniones seleccionando las islas que contienen dos o más segmentos conectados: las curvas solo contienen segmentos conectados.

Debido a la simetría del almacenamiento en búfer, los centroides de las islas de intersección son los puntos de intersección.

Un aspecto hermoso de este estilo de análisis es que no le importa cómo se representa la polilínea subyacente: podría ser una característica única, podría ser una característica para cada segmento de línea, o cualquier cosa en el medio.

    
respondido por el whuber 30.11.2011 - 00:15
6

Sí, podrías hacer esto con FME seguro. Hay muchos "transformadores" que manejan la limpieza, las intersecciones y la topología; Probaría el TopologyBuilder en este caso.

Cualquier secuencia de comandos se realiza en un entorno gráfico, por lo que es muy simple de hacer.

Siempre puede obtener una versión de prueba de www.safe.com

(Divulgación: Mark Ireland, también conocido como FME Evangelist, Safe Software Inc.)

    
respondido por el Mark Ireland 08.12.2010 - 17:24
2

El GRASS GIS tiene herramientas muy eficientes para limpiar los polígonos de la forma que desee, eche un vistazo a: enlace

    
respondido por el Pablo 08.12.2010 - 14:26
-1

El analista de red de Arcgis, que puede obtener con una prueba gratuita, lo hace en menos de 10 segundos y con solo unos pocos clics.

    
respondido por el Thad 29.11.2011 - 21:38
-1

El proceso se puede realizar en ArcGIS con un analista de red.

También hay otra forma en ArcGIS: puede seguir los siguientes pasos: "Arctoolbox" → "Herramientas de administración de datos" → "características" → "características de vértices a puntos" y allí puede hacer lo que necesite.

    
respondido por el Abed 22.01.2013 - 10:22

Lea otras preguntas en las etiquetas