Replicar vectoriales tipo polígono mediante un script de python: GRASS-QGIS

En un foro sobre SIG, un participante tenía el requerimiento de replicar un vectorial tipo polígono, con un patrón relativamente complejo, en una malla cuadriculada. Como es obvio, un simple copy/paste del mismo no funciona porque lo dejaría anclado siempre en el mismo lugar geográfico. Para que la replicación surta efecto el vectorial debe ser desplazado lateralmente (o verticalmente dependiendo de la estrategia que se asuma) antes de ser unido en un nuevo vectorial que refleje el incremento. Para ello se requiere una transformación afín y en GRASS ésto se logra con el módulo v.transform. Para agilizar el proceso éste se puede automatizar mediante un script de python; el cual permite controlar el tamaño de la rejilla mediante una copia y unión sistemática a lo largo de filas y columnas.

Para probar el procedimiento se creó un vectorial tipo polígono, de 10000 mx10000 m, con 5 unidades en su interior (ver imagen siguiente), para replicarlo en una rejilla de 9 filas por 9 columnas.

El script de python fue el siguiente:

#! /usr/bin/env python
# -*- coding: utf-8

import grass.script as grass

from os import system

system("clear")

def main():

	grass.run_command("g.copy",
						vect="poligono_figura,copia",
						quiet="True")

	desplaz_x = 10000
	desplaz_y = 0
	h=7

	for i in range(80):
		#Desplaza poligono_figura hacia la derecha y lo copia como clon
		grass.run_command("v.transform",
							input="poligono_figura",
							output="clon",
							xshift=desplaz_x,
							yshift=desplaz_y,
							quiet="True",
							overwrite="True")

		#Une inicialmente la copia de poligono_figura con clon
		grass.run_command("v.overlay",
							ainput="copia",
							binput="clon",
							output="union",
							operator="or",
							quiet="True",
							overwrite="True")

		grass.run_command("g.copy",
							vect="union,copia",
							quiet="True",
							overwrite="True")
	
		desplaz_x += 10000 #desplazamiento hacia la derecha cada 10000 m

		if i==h:
			desplaz_y -=10000 #desplazamiento hacia abajo 10000 m
			desplaz_x = 0
			h+=9

	grass.run_command("g.remove",
						vect="clon",
						quiet="True")

	grass.run_command("g.copy",
						vect="copia,salida_union",
						quiet="True",
						overwrite="True")

	grass.run_command("g.remove",
						vect="copia",
						quiet="True")

	grass.run_command("g.remove",
						vect="union",
						quiet="True")

if __name__ == "__main__" : main() 

Su ejecución, en cónsola de GRASS-QGIS, produjo el siguiente resultado:

En la imagen anterior se observa que la replicación se efectuó de la manera esperada.

Esta entrada fue publicada en Código Python, GRASS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s