¿Cómo simplificar una red enrutable?

23

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 están ubicados 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 satisfecho con los resultados (gris = original, negro = ajustado):

    
pregunta underdark 19.07.2011 - 10:16

5 respuestas

7

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

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

Corta las carreteras con una tolerancia de 5 metros y elimina todas las líneas de longitud cero. No es una solución óptima, ya que parece ajustarse de forma bastante aleatoria a algún vértice.

    
respondido por el underdark 19.07.2011 - 14:47
5

¿Has probado el GRASS v.generalize ?

v.generalize le permite elegir el algoritmo de generalización con el atributo method . Hay un grupo: douglas, douglas_reduction, lang, reducción, reumann, boyle, slide_averaging, distance_weighting, chaiken, hermite, snakes, network, desplazamiento .

Y los parámetros adicionales como threshold , degree_thresh , angle_thresh (según el algoritmo elegido) pueden ayudarlo a obtener un resultado preciso.

Aquí viene un tutorial .

    
respondido por el simo 19.07.2011 - 10:25
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. Encuentre todos los nodos con solo dos bordes.
  3. Curar los bordes.

ST_ModEdgeHeal fusionará un borde con el otro. ST_NewEdgeHeal reemplazará a ambos con una nueva ventaja.

Manual de topología de PostGIS

    
respondido por el Sean 19.07.2011 - 15:43
1

@underdark, veo que ha escrito un herramienta para densificar líneas en Sextante. Por lo tanto, sugiero el siguiente algoritmo para evitar que "al azar" ajuste uno de tus 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 puede usar v.net primero en Para eliminar los pseudonodos (nodo que conecta solo dos líneas)

    
respondido por el radouxju 02.06.2014 - 09:06
0

Reenviando 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
    
respondido por el user30184 29.05.2014 - 16:25

Lea otras preguntas en las etiquetas