Script de bash para determinar valor máximo en columnas con v.db.select (GRASS-QGIS)

En artículos pasados se propuso la determinación del índice de alargamiento de una cuenca hidrográfica cuyo valor se estimaba como la relación del largo del río entre la anchura máxima de la cuenca perpendicular al río. Para determinar de manera expedita el largo del río se creo un script de bash. Para la anchura máxima se va a hacer lo mismo pero antes se va exponer un recuento del procedimiento para justificar la estructura del script.

El río se digitalizó de manera arbitraria con pocos puntos (21) para verificar que cada paso del proceso se llevaba a cabo de manera satisfactoria. Primero, el vectorial se dividió en trozos lineales de dos puntos para los cuales se determinaron las ecuaciones de las rectas perpendiculares que pasaban por su punto medio. Esas rectas intersectaban al shapefile de la cuenca en dos puntos generando dos distancias perpendiculares desde el centro del segmento que automáticamente pasaban a tener el mismo valor de grupo y se disponían de manera sucesiva en la tabla atributiva. Sumando de dos en dos esos valores (42 en total) es fácil segregar la anchura máxima de la cuenca perpendicular al río en un sólo bucle.

En el script siguiente:

#! /bin/bash
clear
temp=(`v.db.select map=cuenca_intercepto2 col=distancia | grep -oE '[0-9.-]*'`)
length=$(expr `echo ${#temp[*]}` - 1)
mayor=0
for i in $(seq 0 2 $length)
do
suma=$(echo "scale=5; (${temp[$i]} + ${temp[$i+1]})*100000" | bc)
suma=${suma/.*}
if [ $suma -gt $mayor ] 
   then 
	let "mayor = $suma"
fi
done
echo $(echo "scale=5; $mayor/100000" | bc)

la variable temp corresponde al arreglo de 42 valores, producto de la expansión del comando v.db.select para el vectorial cuenca_intercepto2 y su columna distancia (filtrado por grep para eliminar el encabezado de la columna), y length es el largo del arreglo (menos 1 porque, como en C, el arreglo comienza desde 0) necesario para recorrerlo de 2 en 2 (tal como se visualiza en el for). Como en bash los números en coma flotante se interpretan como strings es necesario apelar a la calculadora bc para efectuar de manera adecuada las sumas. Otra limitación de bash es que los if/then, para la segregación del valor máximo de la anchura de la cuenca, sólo permiten la comparación de enteros y para soslayar ese problema las sumas pareadas se multiplican primero por 100000 (para preservar los decimales dictados por scale=5) antes de convertirlas en enteros (con suma=${suma/.*}). Finalmente, el valor máximo obtenido debe convertirse en punto flotante dividiendo entre 100000 nuevamente con la calculadora bc.

La elaboración del script fue posible gracias al apoyo bibliográfico de esta referencia:

Advanced Bash-Scripting Guide-The Linux Documentation Project

Se grabó como script_max_col, se le dieron permisos de ejecución con chmod +x script_max_col y se ejecutó con ./script_max_col en cónsola de GRASS-QGIS. Para este caso particular, el valor obtenido de 103560.08673; tal como se evidencia en la siguiente imagen:

es el mismo que en:

Puntos de intersección de familia de rectas ortogonales con shapefile de cuenca hidrográfica y estimación de anchura máxima perpendicular al río

prescindiendo totalmente de la hoja de cálculo.

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

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