Serie: Flujo de trabajo con R y QGIS. Parte 1
Introducción
QGIS es uno de los software de código abierto más representativos en el mundo de los Sistemas de Información geográfica de escritorio. Si bien, forma parte de una gran lista de software de la fundación OSGeo, existe una larga lista de empresas reconocidas que apuestan por este software ( Listado de sponsors).
R por su parte, es un software bastante conocido por sus facilidades para el análisis estadístico. Este también ha sido aceptado tanto en el mundo científico como en el ámbito de las empresas e instituciones de estadísticas de todo el mundo. Por lo que es de esperarse que también tenga una comunidad de usuarios muy activa y un núcleo de desarrolladores muy sólido.
Este es el primero de tres entradas de blog en que mostraremos estrategias para aprovechar las potencialidades de ambos mundos. En esta primera entrada empezaremos revisando las alternativas que existen al momento de usar algoritmos de QGIS dentro de un ambiente de R.
Los Algoritmos de QGIS
QGIS más allá de ser un software de escritorio también es una API de desarrollo. Por lo tanto tiene algoritmos que se pueden ejecutar desde una línea de comandos. Lo que resulta muy conveniente tanto para el mundillo de los usuarios R espacial, como para otros tantos analistas espaciales (principalmente los usuarios de QGIS).
La base de toda esta entrada está claramente detallada en los apartados 22.7 y 22.8 de la guía de usuario de QGIS. Aunque en versiones de la QGIS 2.x se usaba RQGIS con muy buen rendimiento, para las versiones de QGIS 3.14 en adelante no existe un paquete completamente maduro que recoja todos los beneficios de la nueva API de QGIS. Por lo tanto en los ejemplos posteriores se usará el paquete qgisprocess como alternativa para ejecutar los algoritmos de QGIS processing.
Preparación del ambiente.
Antes de empezar a correr QGIS processing desde R,debo recomendarte que tengas listas y correctamente configuradas las dependencias con las que vas a trabajar:
- QGIS versión 3.14 o superior
- R versión 4.0.6 (también se puede usar desde 3.5 pero recomiendo usar las versiones 4.0 en adelante)
- GDAL 3.0 en adelante
- SAGA-GIS 2.3 en adelante
- GRASS-GIS 7.0 en adelante
- otras dependencias a tu gusto
Si eres usuario de windows, te recomiendo gestionar todas estas dependencias usando el instalador de OSGEO4W
Por otro lado, te recomiendo que le eches un vistazo a esta otra entrada de blog donde se explican detalles de cómo preparar tu ambiente de trabajo para R Espacial. Y como bono de bienvenida, para los usuarios de Linux, este estupendo vídeo de Raúl Nanclares explica en vivo como el Entorno de Análisis GeoEspacial en Linux (Ubuntu 20.04)
En linux es posible que se requiera instalar algunas blibliotecas del sistema antes de instalar ciertos paquetes en R. Por lo cual recomiendo revisar el sitio de Package Manager para saber los prerequisitos del sistema para cada paquete en tu distribución Linux.
Parte 1: Trabajando con QGIS Processing desde R
El paquete qgisprocess
es un paquete que permite ejecutar los algoritmos de QGIS processing mediante el ejecutador de procesos en línea de comandos qgis_process
. Esta es una de las bondades de la nueva API de QGIS ya que no es necesario hacer elaborados scripts para aprovechar la caja de herramientas. Nótese que, en esta entrada, nos referimos al paquete de R cuando se menciona qgisprocess
(sin guión bajo), mientras que para el ejecutador de procesos de Qgis con qgis_process
(con guión bajo).
The qgisprocess package wraps the qgis_process command-line utility, which is available in QGIS >= 3.14.16, released in September 2020. MacOS users will have to install a recent nightly build until QGIS 3.16 has been released; download instructions for all platforms are available at https://download.qgis.org/. If a recent version of QGIS isn’t available for your OS, you can use one of the Geocomputation with R Docker images with QGIS installed. (Dewey Dunnington, @paleolimbot)
No hay una versión estable de qgisprocess
en CRAN. Sin embargo, se puede instalar la versión en desarrollo desde el
repositorio en GitHub.
# install.packages("remotes")
remotes::install_github("paleolimbot/qgisprocess")
Cuando se ha instalado se puede llamar la bliblioteca de la forma habitual como se hace en R. Si todo va bien verás un mensaje como se muestra a continuación
library(qgisprocess)
Using 'qgis_process' at 'qgis_process'.
QGIS version: 3.20.3-Odense
Metadata of 1539 algorithms successfully cached.
Run `qgis_configure()` for details.
Si algo ha ido mal, se puede ver qué ocasionó el error usando la función qgis_configure()
. Lo que hace esta función es intentar localizar el ejecutable en línea de comando
qgis_process
Cuando el paquete ha sido cargado y configurado correctamente en la sesión de R, ya se puede empezar a usar. Lo primero será entender cómo funciona el paquete.
Las funciones de qgisprocess
envían instrucciones mediante process::run
al ejecutable qgis_process
. El resultado es devuelto como una lista de instrucciones que son interpretadas como insumos de salida para otras funciones en R. Se verá mejor con un ejemplo:
Vamos a calcular un área de influencia (buffer) de la capa de condados de North Carolina. Necesitamos un objeto de Simple features
para pasarle como entrada a qgisprocess
. Entonces leeremos usando la función sf::st_read()
entrada <- sf::read_sf(system.file("shape/nc.shp", package = "sf"))
plot(st_geometry(entrada), col = "steelblue")
Ahora si, podemos calcular el área de influencia con el algoritmo native:buffer
.
resultado <- qgis_run_algorithm(algorithm = "native:buffer",
INPUT = entrada, #<- parámetro de la herramienta
DISTANCE = 1, #<- parámetro de la herramienta
DISSOLVE = TRUE, #<- parámetro de la herramienta
.quiet = FALSE
)
Lo que nos dará como resultado un objeto de clase qgis_result
, la cual contiene las rutas a ficheros temporales que contienen las salidas del algoritmo de QGIS ejecutado mediante qgisprocess
resultado
<Result of `qgis_run_algorithm("native:buffer", ...)`>
List of 1
$ OUTPUT: 'qgis_outputVector' chr "/tmp/RtmplHA5hd/file3aca38fc7913/file3aca69989e42.gpkg"
A partir de aquí, solo hace falta cargar este nuevo fichero a la sesión de R. Para nuestro ejemplo se puede hacer fácilmente de la siguiente manera:
# Así...
buf <- sf::st_read(resultado[[1]])
# o también así
buf <- sf::st_read(qgis_output(resultado, "OUTPUT"))
plot(sf::st_geometry(buf), col = "steelblue")
En resumen, para obtener el resultado de un algoritmo de qgis_process
se requieren dos momentos: 1) Ejecutar el proceso deseado con qgisprocess::qgis_run_algorithm()
y 2) Leer el resultado con alguna de las funciones de R para datos espaciales, ej. sf::st_read()
.
Para concluir sobre el trabajo con QGIS dentro de R, quiero también introducir el paquete de R qgis
desarrollado por
Jan Caha. También es un paquete en desarrollo, por lo que solo está disponible para instalar desde el repositorio:
# install.package("remotes")
remotes::install_github("JanCaha/r_package_qgis")
Este paquete está siendo diseñado para trabajar sobre qgisprocess
, mediante llamadas más simples para el usuario R, incluyendo la posibilidad de tener la documentación de las blibliotecas de Processing de QGIS dentro de R. El ejemplo anterior puede ser ejecutado así:
resultado2 <- qgis::qgis_buffer(entrada, DISTANCE = 1, DISSOLVE = TRUE) |>
sf::st_read(resultado[[1]])
Reading layer `file3aca358d39d3' from data source
`/tmp/RtmplHA5hd/file3aca38fc7913/file3aca358d39d3.gpkg'
using driver `GPKG'
Simple feature collection with 1 feature and 14 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -85.31306 ymin: 32.88374 xmax: -74.46764 ymax: 37.58832
CRS: NA
Debido a que el paquete qgis
es un conjunto de accesos directos a los algoritmos soportados oficialmente por QGIS Processing, solo se podrán usar con este paquete aquellos algoritmos nativos de qgis, los de Saga-gis y los Grass-gis que estén dentro de processing. Sin embargo, se recomienda no cargar la biblioteca completa en la sesión de R (), ya que se estaría cargando más de 900 funciones (una por cada algoritmo de Processing de QGIS). En su lugar, se recomienda llamar las funciones de la forma library(qgis)
qgis::qgis_buffer(...)
. Para los algoritmos que no sean soportados oficialmente por QGIS, se puede usar qgisprocess::qgis_run_algorithm()
de la misma forma como ya se ha explicado antes.
Nota: Los paquetes RQGIS
y RQGIS3
ya no tienen soporte para las nuevas versiones de QGIS, por lo que han sido descontinuados en favor de qgisprocess
Actualización: Se prevé que para las nuevas versiones de QGIS a partir de la 3.22, los algoritmos de proveedores de SAGA y GRASS ya no tendrán soporte oficial de QGIS, pero todavía podrán ser usados mediante complementos.
Finalmente, me parece impresionante la dedicación de Dewey Dunnington ( @paleolimbot) y Jan Caha ( @cahik13) en estos dos paquetes y la integración de QGIS en R, por lo que les agradezco infinitamente.
No se pierdan la segunda parte del Flujo de Trabajo con R y QGIS …