Script de python para introducir resultados de operaciones complejas en registros de tablas (driver dbf) con db.execute (GRASS-QGIS)

Como se ha mencionado anteriormente, es imposible ejecutar directamente comandos de SQL o el módulo v.db.update para incorporar en los campos de tablas, con el driver dbf, resultados de operaciones que resulten de determinaciones que involucren raíces cuadradas, logaritmos o funciones trigonómetricas porque no está soportado en GRASS-QGIS. Sin embargo, es posible actualizar los campos como resultado de operaciones complejas si éstos se realizan externamente en un arreglo con uno o varios campos producto de la ejecución de v.db.select para luego ser copiados mediante grass.script con db.execute.

Para probar el procedimiento en la tabla atributiva del vectorial verizona5, que incluye los campos slope_ort, mean_x y Xn (este último vacío), se van a copiar a Xn los valores producto de la siguiente operación con raíces cuadradas:

Xn[i]=d/sqrt(slope_ort[i]*slope_ort[i]+1) + mean_x[i]

El código propuesto es:

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

import grass.script as grass
from math import *

from os import system

system("clear")

#Seleccion de los valores de la pendiente ortogonal
slope_ort=grass.read_command("v.db.select", flags="c", map="verizona5", col="slope_ort")

slope_ort=(slope_ort.split("\n"))

for i in range(len(slope_ort)-1):    #preparando el arreglo de valores numericos
	slope_ort[i]=float(slope_ort[i]) #el ultimo se descarta porque es caracter de fin de archivo 

slope_ort= slope_ort[0:(len(slope_ort)-1)]

#Seleccion de los valores de mean_x[i]

mean_x=grass.read_command("v.db.select", flags="c", map="verizona5", col="mean_x")

mean_x=(mean_x.split("\n"))

for i in range(len(mean_x)-1):
	mean_x[i]=float(mean_x[i])

mean_x= mean_x[0:(len(mean_x)-1)]

#Calculo de Xn[i]

d=135000 #Ancho de la cuenca

Xn = range(len(mean_x)) #definiendo el arreglo para Xn

for i in range(len(mean_x)):
	Xn[i]=d/sqrt(slope_ort[i]*slope_ort[i]+1) + mean_x[i] #operacion con raiz cuadrada

#copia en campo Xn de valores producto de operaciones complejas
for i in range(len(mean_x)):
	input="UPDATE verizona5 SET Xn=" + str(Xn[i]) + " WHERE cat = " + str(i+1)
	grass.write_command("db.execute", stdin = input)

La ejecución del script produjo la siguiente salida en la tabla atributiva:

que es idéntica a la que se encuentra en:

Familia de rectas ortogonales que pasan por el punto medio de cada segmento individual de una polilínea

y que fue producto de la determinación con la calculadora de campos permitiendo verificar que el script python funciona de manera adecuada.

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

3 respuestas a Script de python para introducir resultados de operaciones complejas en registros de tablas (driver dbf) con db.execute (GRASS-QGIS)

  1. Maia Guillen dijo:

    Graciasss!!. Esta entrada me ha venido de perlas.

    A la final sí que tendré que pillar el curso completo. Ya me pasarás los precios por email.

    Saludos desde Barcelona,

  2. Pingback: Script de python para introducir resultados de operaciones complejas en registros de tablas (driver dbf) con db.execute (GRASS-QGIS) | Geoprocessing - Geoprocessamento | Scoop.it

  3. Pingback: Cómo conectar bases de datos externas en GRASS a archivos vectoriales |

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