Cómo conectar bases de datos externas en GRASS a archivos vectoriales

En un artículo anterior se señaló como importar archivos *.csv (comma separated values) en GRASS mediante un script de python. Estos archivos son transformados e incorporados en el directorio de bases de datos con driver dbf del correspondiente espacio de trabajo. Si se observa la documentación del módulo db.select, aunque se pueden realizar consultas SQL, no existen opciones directas para manipular los campos de la tabla respectiva.

No obstante, si se considera el ejemplo tratado en el link de inicio, con db.select datos ya es posible generar la siguiente salida:

ID|a|b|c
1|5.01|2.33|2.33
2|5.01|2.33|2.33
3|5.01|2.33|2.33
4|5.01|2.33|2.33
5|5.01|2.33|2.33  

y aún mejor con:

db.select -c datos fs=" "

donde el arreglo matricial resultante:

1 5.01 2.33 2.33
2 5.01 2.33 2.33
3 5.01 2.33 2.33
4 5.01 2.33 2.33
5 5.01 2.33 2.33

es fácilmente manipulable, por ejemplo, en python. Sin embargo, si se conecta la base de datos a un vectorial, el módulo v.db.select permite particularizar la consulta a columnas específicas. Con el comando:

g.list vect

se pueden visualizar todos los archivos vectoriales en el espacio de trabajo y con:

db.tables -p

todas las tablas con driver dbf; incluyendo las atributivas de los vectoriales.

Por defecto, si un vectorial creado en el espacio de trabajo tiene una tabla atributiva, la ejecución, por ejemplo, de:

v.db.connect -p verizona

para un vectorial de nombre verizona debería dar lugar a una salida similar a ésta:

El mapa vectorial <verizona@jose> está conectado por:
capa <1> tabla <verizona> en la base de datos </home/zeito/datagrass/tiznados3/jose/dbf/> a través del controlador <dbf> con clave <cat>

Si por alguna razón la salida es algo como esto:

ERROR: La conexión a la base de datos para el mapa <verizona@jose> no
       está definida en el archivo DB

es conveniente añadir una tabla atributiva mediante:

v.db.addtable verizona

Hechas ya todas las verificaciones, entonces se va a conectar al vectorial verizona, cuya tabla atributiva tiene, por defecto, el mismo nombre y layer 1, la tabla externa datos como layer 2 con el comando:

v.db.connect map=verizona table=datos layer=2

cuya salida sería algo como ésto:

La tabla <datos> ahora es parte del mapa vectorial <verizona> y se puede
borrar o sobrescribir por los módulos de GRASS
Los privilegios seleccionados fueron asignados sobre la tabla

Para eliminar la conexión bastaría simplemente con:

v.db.connect -d map=verizona table=datos layer=2

Para averiguar el número de columnas de, respectivamente, verizona y datos se tendría:

zeito@debian:~$ db.columns verizona
cat
zeito@debian:~$ db.columns datos
ID
a
b
c

Sin embargo, una vez conectada la base datos a verizona, se tienen múltiples opciones de despliegue a través de v.db.select. Por ejemplo, con:

v.db.select -c map=verizona layer=2 columns=a,a,a,b,b,b,c,c,c fs=" "

la salida es:

5.01 5.01 5.01 2.33 2.33 2.33 2.33 2.33 2.33
5.01 5.01 5.01 2.33 2.33 2.33 2.33 2.33 2.33
5.01 5.01 5.01 2.33 2.33 2.33 2.33 2.33 2.33
5.01 5.01 5.01 2.33 2.33 2.33 2.33 2.33 2.33
5.01 5.01 5.01 2.33 2.33 2.33 2.33 2.33 2.33

pero con:

v.db.select -c map=verizona layer=1 fs=" "

es simplemente 1. Es obvio que datos es sólo un ejemplo hipotético pero se pueden generar matrices o arreglos de una sola dimensión fácilmente manipulables en entorno de programación. Por otra parte, no haría falta preocuparse por los “join” de la tabla atributiva de archivos vectoriales a tablas externas o por la manipulación de las tablas atributivas de vectoriales dentro de los SIGs como fuente potencial de corrupción de estos archivos; como se suele leer en foros. Los datos pueden entonces manipularse externamente mediante hojas de cálculo u otros programas, importarse al ambiente de trabajo y conectarlos al archivo vectorial para ser empleados de manera directa en el ambiente de trabajo. No obstante, si se desea, pueden incorporarse a las tablas atributivas, de forma equivalente a un join, tal como se presenta en:

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

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

4 respuestas a Cómo conectar bases de datos externas en GRASS a archivos vectoriales

  1. Maia Guillen dijo:

    Esta entrada es muy interesante. Si estás en la facultad esta semana sería genial que quedásemos para que me explicaras algunos detalles, claro, si los demás alumnos te dejan algún hueco.
    Saludos,

    • Gracias por el comentario. Allí nos vemos!

      Saludos

      • Ignacio dijo:

        Hola, me preguntaba si era posible a través de QGIS tomar una base de datos común, en SQL o un texto delimitado por coma, y a partir de las direcciones (de calles y alturas) que esta tiene, cargarlas en Qgis y mostrarlas como un shape de punto. El problema que no puedo resolver es como introducir en esa base de datos ya creada las coordenadas para que el programa gis las pueda representar.
        Muchas gracias

  2. Para lo primero:

    Capa -> Añadir capa de texto delimitado

    con coordenadas y la salvas como shapefile. Luego haces un join tal como se señala aquí:

    https://joseguerreroa.wordpress.com/2012/01/04/hacer-join-a-tablas-externas-en-qgis/

    Para lo segundo:

    https://joseguerreroa.wordpress.com/2012/03/04/anadir-coordenadas-xyz-en-qgis-con-plugin-de-grass/

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