Oct 31, 2015

QGIS, un software libre y de código abierto, se ha convertido en uno de los SIG (sistemas de información geográfica) líder del mercado. Gracias al trabajo de un grupo activo de desarrolladores, QGIS contiene módulos de geoprocesamiento similares a herramientas estándar que se encuentran en SIG privativos. Además, QGIS permite la lectura y escritura de la mayoría de formatos vector y raster, al tiempo que provee una interfaz a bases de datos como PostgreSQL/PostGIS, SpatiaLite y MySQL.

Una de las características más atractivas de QGIS es su integración con otros paquetes estadísticos y SIG de código abierto. Actualmente, QGIS soporta SAGA, Orfeo Toolbox, GRASS GIS y R, lo cual expande ampliamente la funcionalidad de QGIS. En este post hago énfasis en la integración entre QGIS y R y explico cómo configurar el sistema de procesamiento de QGIS para ejecutar un algoritmo externo de R desde el módulo de procesamiento de QGIS.

Configuración de la aplicación R en QGIS

Para ejecutar un algoritmo de R en QGIS, primero tenemos que activar R en QGIS e indicar la carpeta donde están localizados los archivos binarios de R. En la interfaz de QGIS, debemos ir al menú ‘Processing’ y luego seleccionar ‘Options…’. En la ventana ‘Processing options’ (ver el pantallazo abajo), debemos ir a ‘R scripts’ y marcar la casilla junto a ‘Activate’. En la opción ‘R folder’, debemos buscar y seleccionar la carpeta donde está instalado R en nuestro computador. También fijémonos en la opción ‘R Scripts folder’; éste es el folder donde serán guardados los scripts de R. Cerramos la ventana haciendo click en ‘Ok’.

Ahora abramos el panel ‘Processing Toolbox’ haciendo click en ‘Toolbox’ en el menú ‘Processing’ de QGIS. El panel se debe abrir en el lado derecho de la interfaz de QGIS. Notemos el menú desplegable en la parte inferior derecha del Processing Toolbox que indica que estamos viendo la interfaz simplificada (‘Simplified interface’). Cambiemos a la interfaz avanzada (‘Advanced interface’).


Cómo correr un script de R en QGIS

En el siguiente ejemplo voy a explicar cómo correr en QGIS un script de R que muestrea ubicaciones (puntos) dentro de un shapefile de multipolígonos siguiendo un muestreo aleatorio estratificado. El tamaño de muestreo es leído de una tabla (en formato csv) que indica el número de puntos a ser creados para cada categoría de un mapa temático (en este caso, tipos de coberturas terrestres). El siguiente pantallazo muestra el mapa de coberturas y la tabla cargada en QGIS usando el panel ‘Browser’:

Para este ejemplo necesitamos el paquete ‘sp’ de R. Si este paquete no está instalado en tu librería de R, te recomiendo leer en este post anterior cómo instalarlo.

Ahora creemos un script de R en QGIS. En el panel Processing Toolbox, vamos a ‘R scripts’ - ‘Tools’ y hacemos click en “Create new R script”. Se despliega una nueva ventana llamada ‘Script editor’:

Copiemos y peguemos el siguiente código en el editor de scripts:

##polyg=vector
##polyg_category_id=field polyg
##sizes_table=table
##table_category_id=field sizes_table
##sampling_size=field sizes_table
##output=output vector
library(sp)
i <- 1
category <- unique(polyg[[polyg_category_id]])[i]
categorymap <- polyg[polyg[[polyg_category_id]] == category,]
n <- sizes_table[which(sizes_table[[table_category_id]] == category), sampling_size]
spdf1 <- SpatialPointsDataFrame(spsample(categorymap, n, "random"), data = data.frame(category = rep(category, n)))

for (i in 2:length(unique(polyg[[polyg_category_id]]))){
  category <- unique(polyg[[polyg_category_id]])[i]
  categorymap <- polyg[polyg[[polyg_category_id]] == category,]
  n <- sizes_table[which(sizes_table[[table_category_id]] == category), sampling_size]
  spdf1 <- rbind(spdf1, SpatialPointsDataFrame(spsample(categorymap, n, "random"), 
                                               data = data.frame(category = rep(category, n)))
  )
}
output = spdf1


Las primeras seis líneas, que comienzan con doble signo de número (##), le indican a QGIS los parámetros de entrada y de salida del algoritmo, y son usadas para crear la interfaz gráfica. Esta información también es usada para crear los objetos de R correspondientes que son usados posteriormente como parámetros de entrada para los comandos de R.

En este caso particular, le estamos diciendo a QGIS que definimos un parámetro llamado ‘polig’ de tipo ‘vector’, y otro parámetro llamado ‘sizes_table’ de tipo ‘table’ (en la primera y tercer líneas, respectivamente). ‘polyg_category_id’ y ‘table_category_id’ son columnas de la tabla del mapa vectorial y de la tabla en formato .csv, respectivamente, los cuales son la columna clave (o llave primaria) que van a ser usados para emparejar las dos tablas. Para este ejemplo, esta columna clave representa un identificador único para cada categoría (i.e., tipo de cobertura terrestre).

Después de definir los parámetros de entrada se carga el paquete ‘sp’, se crean las ubicaciones de los puntos de muestreo para la primera categoría, y luego se crean los puntos de muestreo para las categorías segunda hasta la última, los cuales son unidos a los puntos creados previamente.

Para correr el algoritmo hacemos click en el botón ‘Run algorithm’ en el editor de scripts. Se abre una nueva ventana con tres pestañas: ‘Parameters’, ‘Log’ y ‘Help’. En la pestaña ‘Parámetros’ seleccionamos el mapa vector, la columna clave en el mapa, la tabla (e.g., un archivo .csv), la columna clave en esta tabla y la columna de la tabla que indica el tamaño de muestreo para cada categoría. Si lo deseamos podemos guardar el resultado en un archivo permanente (e.g., un shapefile) o generar un archivo temporal (simplemente dejamos en blanco el campo ‘output’). Hacemos click en el botón ‘Run’ para ejecutar el algoritmo.

Las ubicaciones de muestreo resultantes se deben desplegar después de que finaliza la ejecución del algoritmo:

Para guardar el script de R hacemos click en el ícono ‘Save’ del editor de scripts. En la siguiente ventana observamos que estamos ubicados en el folder rscripts (e.g., C:\Users\Guest.qgis2\processing\rscripts) y que el archivo va a ser salvado como un ‘Processing R script’. Asignamos un nombre y guardamos el archivo, el cual queda salvado con extensión ‘.rsx’.

Una vez guardado, el algoritmo también puede ser ejecutado en modo de procesamiento en lotes. El script guardado lo podemos ver en el panel ‘Processing Toolbox’ dentro del grupo ‘User R scripts’. Le damos click derecho al algoritmo y seleccionamos ‘Execute as batch process’. Se abre una ventana llamada ‘Batch Processing’, como se muestra en el siguiente pantallazo:

En la pestaña ‘Parámetros’ debemos ingresar los parámetros de entrada del algoritmo para cada proceso. Una vez listo, hacemos click en ‘Run’.

A continuación puedes observar un video tutorial que presenta cómo realizar cada uno de los pasos descritos anteriormente para configurar y ejecutar un script de R en QGIS:


Observaciones finales

Ejecutar un algoritmo de R desde QGIS nos puede ayudar a hacer más eficiente el manejo y la visualización de datos. Este método de trabajo nos evita tener que escribir líneas de código adicionales para importar los archivos y exportar los resultados que deberán ser abiertos posteriormente en un SIG. Además, los resultados pueden ser visualizados apenas termine la ejecución del script y pueden ser examinados usando las herramientas de zoom y desplazamiento en QGIS (para lo cual R es menos apropiado).

Con respecto a las desventajas, puede ser difícil depurar el código si se presenta un error durante la ejecución del script. Por lo tanto es aconsejable probar el código en R primero para luego correrlo en QGIS una vez el código esté más o menos libre de errores.

Espero que intentes realizar análisis de datos espaciales usando tus scripts de R en QGIS. Cuéntame cómo te va con eso!


También te puede interesar:

* Mapeo web con Leaflet y R


Comparte este post:   



Subscríbete a mi blog y obtén la guía con los '50 mejores plugins de QGIS de 2016'