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

14

Puedo recibir mapas de cualquier fuente para mi proyecto, y para el algoritmo C ++ que estoy haciendo, es imprescindible que el algoritmo sepa dónde están los cruces 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 se disparan (es decir: las carreteras no están conectadas correctamente). Una forma de corregir el problema es 'limpiar' la red de carreteras con Autocad. Las preguntas que tengo son:

  1. ¿Existe una manera eficiente (algún software que pueda hacerlo?) Para obtener mi mapa en formato GML, que contiene información sobre los cruces de carreteras en el mapa? (tal vez tenga una etiqueta GML que dice que un nodo en particular es una unión)
  2. ¿Hay alguna otra forma 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 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 ...

Nav
fuente
2
¿Necesita encontrar caminos auto intersectantes? ¿Cómo debe manejar las geometrías degeneradas (polilíneas donde todos los vértices coinciden, por lo que tienen longitud cero)? ¿Cómo debe manejar las líneas coincidentes donde la intersección es un segmento lineal y no solo un punto?
Kirk Kuykendall
@ Kirk: Estoy un poco sorprendido por las situaciones que has mencionado. Soy nuevo en SIG y ni siquiera sabía que tales posibilidades existían. 1. La intersección propia requiere múltiples segmentos. A menos que sea un paso elevado, consideraría esas intersecciones como uniones. 2. Ni siquiera soy capaz de visualizar qué es la geometría degenerada, así que no sé qué responder. 3.Las líneas coincidentes deben tratarse como dos caminos separados porque así es como supongo que también lo serían en la vida real.
Nav de

Respuestas:

9

Si tiene las carreteras en forma espacial, como un Shapefile, puede cargarlas en PostGIS y hacer que las encuentre automáticamente mediante una consulta SQL. He hecho esto antes: la instrucción SQL está diseñada para encontrar para cada camino aquellos que se cruzan geográficamente y crean 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 : toma el cuadro delimitador de una geometría dada; esto se usa para acelerar el algoritmo. Se puede reducir 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 cruzan
  • ST_Intersection : devuelve la intersección de dos geometrías

Los siguientes son solo fragmentos ya que no tengo tiempo para terminar, tal vez 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
dmsnell
fuente
Solo compartiendo: Otra base de datos que he encontrado es esta: < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Aparentemente, las consultas son muy rápidas porque las consultas están disponibles como bibliotecas que se pueden incrustar en la aplicación.
Nav
1
@ dmsnell- ¿Tal vez podría proporcionar un ejemplo del tipo de consulta SQL utilizada para realizar esta tarea?
RyanKDalton
11

Puede analizar polilíneas de maneras asombrosas mediante el uso de 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 en una pequeña cantidad y luego amortiguar por 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.

Aquí hay un ejemplo de un buffer de polilínea de 10 m (gris) y su buffer de -10 m (rojo claro) en un mapa que tiene 650 m de ancho:

Figura 1

Ahora interseque la capa de polilínea original con estos polígonos de isla, combine los segmentos por identificador de isla y cuente las piezas:

Figura 2

Los segmentos amarillos claros designan las piezas de alto conteo y los segmentos cian oscuros designan los de bajo conteo. De esta manera, hemos (a) encontrado todas las curvas e intersecciones (incluidas las auto-intersecciones) y las uniones cercanas (vea el extremo izquierdo, donde los dos segmentos no se encuentran del todo)) y (b) diferenciaron 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 entidad única, podría ser una entidad para cada segmento de línea, o cualquier cosa intermedia.

whuber
fuente
6

Sí, puedes hacer esto con FME seguro. Hay muchos "transformadores" que manejan la limpieza, las intersecciones y la topología; Me gustaría probar el TopologyBuilder transformador 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 en www.safe.com

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

Mark Ireland
fuente
Secundo esto. FME es excelente para este problema en particular, tanto la transformación de AutoCAD a GML como la limpieza topológica. Puede ser asombrosamente universal en su aplicación.
blord-castillo
-1

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

Thad
fuente
-1

El proceso se puede hacer 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" → "entidades" → "vértices de entidades a puntos" y allí puede hacer lo que necesita.

Una cama
fuente