¿Cómo simplificar una red enrutable?


24

Tengo un gráfico de red que necesito simplificar en el sentido de reducir el número de bordes . La idea sería fusionar los nodos que se encuentran juntos y eliminar los bordes cortos de conexión.

¿Cómo podría lograrse esto en PostGIS o GRASS? ¿O hay mejores enfoques para simplificar automáticamente una red como esta?

Ya he probado la función ST_SnapToGrid pero no estoy contento con los resultados (gris = original, negro = ajustado):

ingrese la descripción de la imagen aquí


1
¿Está haciendo esto para simplificar un análisis basado en la red o para fines de visualización? Si es el primero, ¿qué análisis se realizará?
whuber

Es para el análisis de la ruta más corta.
oscuro

2
Debido a que muchos de los algoritmos de ruta más corta son O (E + V), ¿tal vez ni siquiera necesita esta simplificación? En el otro extremo, para tales análisis, a menudo puede hacer simplificaciones drásticamente más agresivas. Por ejemplo, ese conjunto de tres segmentos paralelos y sus segmentos adyacentes a la izquierda (que parecen un H-in-a-box) se pueden reemplazar por un triángulo si no hay origen o destino dentro de esos segmentos. Menciono esto porque estoy seguro de que hay un código (no SIG) para tales operaciones en gráficos (abstractos).
whuber

¿Desea mantener la geometría de los bordes (p. Ej. Curvas) o simplemente es suficiente mantener la topología + nodo XY? Además, ¿necesita asegurarse de que los nodos en Z diferentes (por ejemplo, pasos elevados) no se unen?
AnserGIS

La topología es clave. La geometría puede cambiar un poco. El orden Z tiene que permanecer intacto.
oscuro

Respuestas:


7

Lo más cerca que he llegado hasta ahora es esto:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

Está tomando las carreteras con una tolerancia de 5 metros y eliminando todas las líneas de longitud cero. No es una solución óptima, ya que parece ajustarse al azar a algún vértice.

ingrese la descripción de la imagen aquí


De hecho, el resultado tal vez no sea exacto, pero ese uso de v.clean es interesante, gracias por compartirlo
simo

¿Se crea esa imagen en la hierba?
NetConstructor.com

La imagen muestra los resultados de GRASS v.clean visualizados en QGIS.
oscuro

¿Algún problema con el mantenimiento de "intersecciones extrañas" o caminos separados por pendientes?
dassouki

¿Qué hay de procesar ST_SnapToGrid después de v.clean?
kttii

5

¿Has probado el GRASS v.generalize ?

v.generalizele permite elegir el algoritmo de generalización con el atributo de método . Hay un montón: douglas, douglas_reduction, lang, reducción, reumann, boyle, slip_averaging, distance_weighting, chaiken, hermite, serpientes, red, desplazamiento .

Y los parámetros adicionales como threshold, degree_thresh, angle_thresh(dependiendo del algoritmo seleccionado) puede ayudarle a obtener un resultado preciso.

Aquí viene un tutorial .


Gracias por el enlace. Lo estoy intentando, aunque realmente no entiendo qué combinación de método y valores de umbral darán el resultado que estoy buscando.
oscuro

Realmente no puedo encontrar un método v.generalize que haga lo que quiero.
oscuro

2
Es una pena, el comando es rico en muchos algoritmos, pero como dijiste antes, probablemente sea bastante complejo configurarlo para obtener el resultado esperado. Tal vez un gurú de algoritmos de generalización, aquí? ¿Has probado también el método de las serpientes ?
simo

No soy un gurú de las cosas aquí, pero creo que el método de las serpientes es el mejor para algunas de mis ejecuciones de v.generalize que hice en el pasado.
Maning

1
Para el registro, los parámetros se han simplificado a partir de hoy en GRASS SVN. Formar parte de GRASS 6.4.2.
markusN

4

No he hecho esto, pero creo que puedo sugerir una dirección.

  1. Cree una topología con PostGIS para su gráfico.
  2. Encuentra todos los nodos con solo dos aristas.
  3. Cura los bordes.

ST_ModEdgeHeal fusionará un borde en el otro. ST_NewEdgeHeal reemplazará ambos con un nuevo borde.

Manual de topología PostGIS


Gracias @Sean. ¿Hará eso algo más que fusionar dos aristas? ¿Alguna idea sobre cómo eliminar bordes cortos y unir sus nodos?
oscuro

@Underdark, no veo nada simple. Podrías hacerlo todo en PL / SQL, pero eso probablemente no ayude. ¿Puedes ejecutar ST_SnapToGrid primero?
Sean

1

@underdark, veo que has escrito un herramienta para densificar líneas en Sextante. Por lo tanto, sugiero el siguiente algoritmo para evitar el ajuste "aleatorio" de uno de sus puntos.

Seleccione los segmentos de línea de los que desea deshacerse en función de su longitud.

Para cada uno de esos segmentos, cree un punto en el punto medio

Eliminar el segmento pequeño

Ahora puede usar ST_Snap en PostGIS (vea el ejemplo aquí )

EDITAR: tenga en cuenta que en su caso, también podría usar v.net primero para eliminar los pseudo-nodos (nodo que conecta solo dos líneas)


Explique cómo se puede usar v.net para eliminar los pseudo-nodos. Gracias
osmjit

0

Remitiendo cómo Michaël Michaud analizó esto en la lista de desarrolladores de OpenJUMP:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

Gracias por publicar esta respuesta. Estoy un poco confundido por qué forzarías el gráfico a plano. Después de todo, las redes de calles no son gráficos planos (puentes, túneles).
oscuro

Solo porque Michaël realizó una prueba rápida con las herramientas gráficas existentes que escribió para OpenJUMP y no admiten gráficas no planas en este momento. Omita el primer paso si QGIS y GRASS tienen herramientas similares que admiten gráficos no planos.
user30184

Creo que este es el enfoque correcto: separar la red en gráficos planos. En cada gráfico plano, el problema es más simple: por ejemplo, uno podría usar el enfoque anterior, o simplemente triangular y eliminar el TIN de los bordes cortos de la carretera. Luego extraiga los bordes de la carretera nuevamente y combine las capas.
AnserGIS
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.