Script de bash para generar y rotar rectángulos a partir de puntos en QGIS-GRASS

En el foro de Gabriel Ortiz, un usuario refiere que tiene un archivo de puntos que simbolizan unos aerogeneradores; cuya tabla atributiva contiene la orientación y el diámetro de los rotores. Su deseo es insertar un rectángulo para cada uno de los aerogeneradores cuyas medidas sean 4 veces el diámetro del rotor hacia la parte frontal y trasera del aerogenerador y 2 veces el diámetro del rotor hacia ambos laterales; con la debida orientación. Como su interés es abordarlo desde la óptica del software privativo, aquí se le dará la perspectiva del software libre usando GRASS-QGIS.

Para ello, inicialmente, se tomará como ejemplo un sólo punto (x,y). Si se quiere generar un rectángulo con las dimensiones deseadas arriba (donde d es el diámetro), las coordenadas de los vértices, ordenados en el sentido de las agujas del reloj y para una orientación inicialmente vertical, serían:

V1 = (x - 2d, y + 4d)  
V2 = (x + 2d, y + 4d)
V3 = (x + 2d, y - 4d)
V4 = (x - 2d, y - 4d)

Generar esos vectoriales de puntos individuales es posible con v.transform. Sin embargo, se precisa de un sólo vectorial cuya integración se obtiene con v.patch. Esto permite, momentáneamente, ajustar la región de GRASS a ese vectorial para producir uno tipo polígono que se amolde a dicha área mediante v.in.region. A este último se le crearán las columnas x, y, ang_rot y se les copiará el contenido de estos campos que se encuentran en el punto (x,y) antes de la rotación. Se propone el siguiente script que toma en cuenta todos los puntos p1,p2,…,pn.

#! /bin/bash
clear
read -p "Numero de puntos = ? " num_punt
for i in $(seq 1 $num_punt)
do
#punto con campos x,y,ang_rot y d
d=`v.db.select map=p$i col=d | grep -oE '[0-9.-]*'`
v1=$(echo "scale=8; -2*$d" | bc -l)
v2=$(echo "scale=8;  4*$d" | bc -l)
v3=$(echo "scale=8;  2*$d" | bc -l)
v4=$(echo "scale=8; -4*$d" | bc -l)
v.transform input=p$i output=V1 xshift=$v1 yshift=$v2 --quiet
v.transform input=p$i output=V2 xshift=$v3 yshift=$v2 --quiet
v.transform input=p$i output=V3 xshift=$v3 yshift=$v4 --quiet
v.transform input=p$i output=V4 xshift=$v1 yshift=$v4 --quiet
v.patch input=V1,V2,V3,V4 output=rectangulo_puntos --quiet
g.remove vect=V1,V2,V3,V4 --quiet
g.region vect=rectangulo_puntos
v.in.region type=area output=rectangulo_area$i --quiet
g.remove vect=rectangulo_puntos --quiet
v.db.addtable map=rectangulo_area$i --quiet
#Agrega las columnas x,y,ang_rot,d al vectorial tipo poligono
v.db.addcol rectangulo_area$i columns="x double precision,y double precision,ang_rot double precision,d double precision" --quiet
#Copia los valores de x,y,ang_rot,d del eje de rotacion en el vectorial tipo poligono
x=`v.db.select map=p$i col=x | grep -oE '[0-9.-]*'`
echo "UPDATE rectangulo_area$i SET x=$x WHERE cat=1"| db.execute
y=`v.db.select map=p$i col=y | grep -oE '[0-9.-]*'`
echo "UPDATE rectangulo_area$i SET y=$y WHERE cat=1"| db.execute
ang_rot=`v.db.select map=p$i col=ang_rot | grep -oE '[0-9.-]*'`
echo "UPDATE rectangulo_area$i SET ang_rot=$ang_rot WHERE cat=1"| db.execute
echo "UPDATE rectangulo_area$i SET d=$d WHERE cat=1"| db.execute
#Rotacion del vectorial tipo poligono
x1=`v.db.select map=rectangulo_area$i col=x | grep -oE '[0-9.-]*'`
y1=`v.db.select map=rectangulo_area$i col=y | grep -oE '[0-9.-]*'`
alpha=`v.db.select map=rectangulo_area$i col=ang_rot | grep -oE '[0-9.-]*'`
alpha=`echo $(echo "scale=8; 360 - $alpha" | bc -l)`
output_file=rectangulo_area$i"_rot$i"
pi=$(echo "scale=20; 4*a(1)" | bc -l)
a=`echo $(echo "scale=8; $x1 - c($alpha*$pi/180)*$x1 + s($alpha*$pi/180)*$y1" | bc -l)`
b=`echo $(echo "scale=8; $y1 - s($alpha*$pi/180)*$x1 - c($alpha*$pi/180)*$y1" | bc -l)`
v.transform input=rectangulo_area$i output=$output_file xshift=$a yshift=$b zrot=$alpha --quiet
echo "listo!"
echo "El vectorial rotado es" $output_file
done
g.region rast=N09W068_UTM19N_canoa

Se grabó como script_generador, se le asignaron permisos de ejecución con chmod +x script_generadory se ejecutó, en cónsola de GRASS, con ./script_generador.

El resultado, para los puntos p1 y p2, se encuentra en la siguiente imagen:

Los rectángulos sin rotar se incluyen en la imagen sólo con propósitos demostrativos. Pueden eliminarse en el script con g.remove. Al final se restituye el área de trabajo original a la del ráster del área total.

About these ads
Esta entrada fue publicada en GRASS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

2 respuestas a Script de bash para generar y rotar rectángulos a partir de puntos en QGIS-GRASS

  1. Pingback: Script de bash para generar y rotar rectángulos a partir de puntos en QGIS-GRASS | Geoprocessing - Geoprocessamento | Scoop.it

  2. Pingback: Script de python para generar y rotar rectángulos a partir de puntos en QGIS-GRASS |

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

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