Skip to content

Análisis de Redes

GRASS provee capacidades para análisis de redes vectoriales. La dirección de los vectores son definidas por la dirección de digitalización. Ambas direcciones son permitidas, los módulos de red proveen parámetros para asignar columnas de atributos de las direcciones hacia adelante y hacia atrás.

Mantenimiento de la red

El comando v.net es utilizado para el mantenimiento de la red vectorial. Este comando informa sobre el estado del grafo que define la red. Este comando también permite insertar nodos perdidos y conectar nodos desconectados al grafo dentro de una distancia dada.

El parámetro operation define el tipo de operación a ejecutar sobre la red. Cuatro opciones están disponibles:

  • nodes: crea la red asignando un punto en cada nodo (final de una línea) si este no existe.
  • connect: conecta puntos aún cuando no estén conectados a la red y agrega líneas. El parámetro thresh es requerido para definir el radio de conexión.

Por ejemplo, considere las siguientes líneas utilizadas para definir una red de calles:

L 2 1
 13 58
 90 66
 1 1
L 2 1
 13 43
 90 52
 1 2
L 2 1
 13 26
 90 35
 1 3
L 2 1
 27 78
 30 13
 1 4
L 2 1
 43 79
 45 38
 1 5
L 4 1
 59 82
 63 17
 46 15
 47 6
 1 6
L 2 1
 76 27
 73 83
 1 7

La importación y posterior separación en segmentos de calle, se puede realizar mediante los comandos:

$ v.in.ascii input=lineas.txt output=calles_temp format=standard -n --overwrite

$ v.clean input=calles_temp output=calles tool=break --overwrite

Se creará ahora el campo de costos tomando como base la categoría de los segmentos:

$ v.db.addtable calles

$ v.db.addcolumn calles col="adelante double, atras double, velocidad double, largo double"

$ v.db.update calles col=velocidad val=40 where="cat=1 or cat=3"

$ v.db.update calles col=velocidad val=60 where="cat=2 or cat=4"

$ v.db.update calles col=velocidad val=50 where="cat=5 or cat=7"

$ v.db.update calles col=velocidad val=70 where="cat=6"

$ v.db.update calles col=atras val=99999

$ v.to.db map=calles option=length col=largo

$ v.db.update calles col=adelante qcol="largo/velocidad"

Por último se crea la red de calles permitiendo que el sistema defina nodos en cada intersección y final de línea:

$ v.net input=calles out=red operation=nodes --overwrite

Distancia más corta

El cálculo de la ruta más corta puede ser ejecutado mediante el comando v.net.path. Los costos pueden ser el largo de la línea, o atributos guardados en una tabla de la base de datos. Los valores de estos atributos son tomados como los costos del segmento completo. Si los costos son leídos desde la tabla ellos pueden ser diferentes en ambas direcciones. Las rutas más corta es escrita a una mapa vectorial junto con una tabla de atributos asociados.

La sintaxis para definir los puntos es:

id categoría_punto_inicio categoría_punto_final

o bien, si se utilizan coordenadas para definir los puntos:

id x_punto_inicial y_punto_inicial x_punto_final y_punto_final

Si los puntos son especificados por categoría, estos deben ser exactamente los mismos que los nodos de la red, mientras que cuando son especificados por coordenadas se utiliza el nodo más cercano al par de coordenadas.

El comando permite utilizar los campos afcol y abcol que determinan la columna de costo cuando se avanza hacia adelante y hacia atrás, respectivamente. También se puede utilizar el campo ncol para especificar la columna de costo para los nodos. Si no se especifican estos campos, entonces el largo de los segmentos de la red es utilizado y un costo en cero es asumido en cada nodo.

Cuando se usan atributos, el largo de los segmentos no es utilizado. Para obtener resultados mas precisos, el largo debe ser tomado en cuenta indirectamente por los atributos. Por ejemplo, para obtener el camino más rápido se necesitaría tener columnas como max_speed y length. El camino más rápido correcto puede ser obtenido especificando afcol=length/max_speed. Si es necesario, el largo de la línea puede ser calculado y escrito a la tabla de atributos mediante el comando v.to.db.

Por ejemplo, el siguiente archivo llamado puntos.txt define las coordenadas del punto de inicio y punto final de la ruta que se desea obtener:

1 13  58 47  6

Se puede ejecutar el cálculo de ruta más corta sin utilizar los costos:

$ v.net.path input=red output=ruta1 file=puntos.txt --overwrite

O bien, se puede ejecutar el cálculo de la misma ruta pero utilizando los campos de costos:

$ v.net.path input=red output=ruta2 file=puntos.txt --overwrite arc_column=adelante arc_backward_column=atras

Mediante este comando también se puede ejecutar el cálculo para visitar muchos sitios en un orden predefinido. Por ejemplo, considere el siguiente archivo llamado puntosParadas.txt que lista una serie de puntos de inicio y final:

1 19 58 43 69
2 43 69 66 63
3 66 63 53 47
4 53 47 28 35
5 28 35 62 25

El comando para ejecutar el análisis con varios puntos es el mismo utilizado para calcular con solo un punto:

$ v.net.path input=red output=ruta2 file=puntosParadas.txt --overwrite arc_column=adelante arc_backward_column=atras dmax=2

Agente viajero

Para crear un ciclo que conecte una secuencia de nodos dados, se utiliza el comando v.net.salesman. Este comando calcula la ruta óptima para visitar los nodos en la red vectorial. Al igual que el cálculo de la ruta más corta, este comando puede incluir costos para cada segmento de la red.

A diferencia del comando v.net.path, al realizar el cálculo del agente viajero solo se puede especificar un campo acol que determina el nombre de la columna representando el costo para los arcos en ambas direcciones. Este comando, no permite especificar el costo para los nodos.

Para realizar el cálculo del agente viajero es necesario que las diferentes paradas sean incorporadas a los datos de la red. Es decir, no hay forma de pasar como parámetro, al comando v.net.salesman, las posiciones de las paradas.

Por ejemplo, considere el siguiente archivo llamado paradas.txt para definir las coordenadas de los diferentes nodos a visitar:

cat,x,y
1,19,58
2,43,69
3,66,63
4,53,47
5,28,35
6,62,25

En primer lugar, los datos deben ser importados en Grass, mediante el comando:

$ v.in.ascii in=paradas.txt out=paradas columns="cat int,x int,y int" cat=1 x=2 y=3 fs="," skip=1 --overwrite

Luego, se crea una nueva red de calles que solo incorpore estos nodos mediante el comando:

$ v.net input=calles red points=paradas out=red2 op=connect thresh=1 --overwrite

Ahora, se puede realizar el cálculo del agente viajero simplemente ejecutanto el comando:

$ v.net.salesman red2 out=rutaViajero1 ccats=1-6 --overwrite

De igual forma, se puede utilizar los costos al hacer el cálculo del agente viajero:

$ v.net.salesman red2 out=rutaViajero1 arc_column=adelante ccats=1-6 --overwrite

Red de servicio

El comando v.net.alloc asigna una sub red a los centros más cercanos. Los nodos utilizados como centros deben ser abiertos (costos >= 0). Los costos de los nodos centrales son usados para el cálculo. El algoritmo permite costos asignados a los arcos y nodos de la red. También se pueden definir diferentes costos en ambas direcciones de una línea vectorial. Para áreas los costos serán calculados entre las líneas frontera.

Por ejemplo, el comando para calcular la red de servicio, sin utilizar costos, para los nodos 1,5 y 6 sería:

$ v.net.alloc red2 output=servicio1 ccats=1,5,6 --overwrite

Para realizar el mismo cálculo, pero usando los costos asociados a los arcos, se utilizaría el siguiente comando:

$ v.net.alloc red2 output=servicio2 ccats=1,5,6 --overwrite arc_column=adelante arc_backward_column=atras

Áreas de servicio

Para separar la red mediante isolíneas de costo se cuenta con el comando v.net.iso. Este comando separa la red en bandas entre las isolíneas de costos (dirección desde el centro). El nodo de centro debe ser abierto (costos>=0). Los costos de los nodo de centro son usados en los cálculos. Este algoritmo también soporta asignación de costos a los arcos y los nodos, y también en ambas direcciones de un segmento.

Por ejemplo, para establecer el área de servicio de los nodos 2 y 4; a distancias de 10,20,30 y más allá; se utilizaría el comando:

$ v.net.alloc red2 output=servicio1 ccats=2,4 costs=10,20,30 --overwrite

Para calcular las áreas de servicio pero utilizando los costos de cada arco, se utilizaría el comando:

$ v.net.alloc red2 output=servicio1 ccats=2,4 costs=1,2,3 arc_column=adelante arc_backward_column=atras --overwrite