Skip to content

Topología vectorial

GRASS es un SIG topológico. Esto significa que los componentes geográficos adyacentes en un mismo mapa vectorial están relacionados. Por ejemplo en un SIG no topológico si dos áreas comparten una frontera común esa frontera se digitalizada dos veces y también se almacena por duplicado. En un SIG topológico existe dicha frontera una sola vez y se comparte entre dos áreas. La representación topológica de datos vectoriales ayuda a producir y mantener mapas vectoriales con geometría limpia, así como permite algunos análisis que no pueden llevarse a cabo con datos no topológicos (llamados espaguetis).

Creación de topología de áreas

GRASS define una capa de áreas (polígonos) como compuesta de dos tipos de entidades: un conjunto de fronteras cerradas y sus centroides. La información de atributos se asocia al centroide.

Por ejemplo, considere el siguiente archivo de datos, llamado rectas.txt, que describe la geometría de cuatro líneas rectas que se intersectan:

L 2 1
  0 3
  9 3
  1 1
L 2 1
  0 6
  9 6
  1 2
L 2 1
  3 0
  3 9
  1 3
L 2 1
  6 0
  6 9
  1 4

Para importar estos datos en Grass se utiliza el comando v.in.ascii que se presentó en el tutorial anterior, de la siguiente forma:

v.in.ascii in=rectas.txt out=rectas -n format=standard

Note que la región en que están definidas dichas rectas está entre (0,0) y (10,10) por lo que conviene establecer la región de procesamiento de Grass sobre dicha extensión, utilizando el comando:

g.region vector=rectas

Debido a que estas rectas se intersectan es necesario separarlas en sus puntos de intersección con el fin de crear segmentos que delimiten las áreas que se crearán. Para ello se debe ejecutar el comando v.clean el cual creará una serie de segmentos junto con una capa de puntos en donde suceden las intersecciones.

v.clean in=rectas type=line tool=break out=segmentos err=interseccion

Para verificar que se hayan creado correctamente las líneas se puede ejecutar el comando v.info en donde se verá que efectivamente se crearon 12 nuevos segmentos de recta:

v.info map=segmentos -t

Ahora, para crear la topología de fronteras se debe ejecutar el comando v.type que permite cambiar el tipo de las geometrías. En este caso interesa convertir las "líneas" en "fronteras" de áreas. En el parámetro from_type se especifica el tipo actual y en el parámetro to_type el nuevo tipo. Por ejemplo, el siguiente comando realiza dicha conversión:

v.type in=segmentos out=fronteras from_type=line to_type=boundary

Este comando presentará un warning indicando que no todas las líneas forman parte de la frontera de algún polígono. A su vez el comando crea un área que está definida por algunos de los segmentos. Sin embargo, aún falta un paso para que el área esté correctamente definida y este consiste de la definición de su centroide. Como ya se había visto anteriormente el comando v.centroids permite crear el centroide de un área para la que ya se han definido sus fronteras. El siguiente ejemplo muestra la forma de invocar este comando:

v.centroids in=fronteras out=poligonos

Para evitar problemas de procesamiento posterior, debido a los segmentos que no forman parte de ninguna frontera, se pueden extraer las áreas de la capa y copiarlas a otra capa. El comando v.extract permite realizar esta tarea para cualquier tipo de geometrías. Por ejemplo, se puede utilizar el siguiente comando:

v.extract in=poligonos out=areas type=area

Nuevamente se puede utilizar el comando para verificar que la capa cuente con únicamente aquellos elementos geométricos que son requeridos:

v.info map=areas -t

Generando nuevas geometrías

Grass permite generar nuevas geometrías a partir de una capa de elementos existentes.

El comando v.split permite dividir líneas en segmentos más pequeños. Este comando divide las líneas en segmentos de un largo indicado en el parámetro length. Un ejemplo de uso de este comando sería:

v.split in=segmentos out=tramos length=1

Sin embargo, cada tramo creado se encuentra asociado mediante la categoría (id) del segmento original. Para identificar cada tramo en forma individual es necesario asignar una nueva categoría. Eso requiere de dos comandos: uno que borre la categoría existente y otro que asigne una nueva categoría:

v.category in=tramos out=tramos2 option=del cat=-1
v.category in=tramos2 out=tramos3 option=add step=1

Otro comando que crea nuevas geometrías es v.to.points que permite crear una capa de puntos a partir de la frontera de los polígonos o a partir de líneas, para eso es necesario especificar a cuanta distancia se crearán los puntos. Un posible uso de este comando sería:

v.to.points input=segmentos output=puntos dmax=2

Ejercicios

  1. Cree un archivo con las diferentes líneas que definen las calles que se presentan en el mapa que se muestra más abajo. Asuma que cada manzana (cuadra) mide 100x100 metros. Asocie el nombre de la calle a cada línea. Posteriormente separe cada calle en sus diferentes segmentos, y cree los polígonos de las cuadras que definen dichos segmentos.

  1. Utilizando los comandos de Grass, cree puntos que representen los postes de alumbrado cada 30 metros sobre todas las calles del mapa.

  2. Utilizando los comandos de Grass, cree tramos de calle cada 200 metros y asigne un ID aleatorio a cada uno de ellos.

  3. Exporte las capas de calles, segmentos, cuadras, postes y tramos a archivos GeoJSON.