Análisis espacial con PyQGIS. Ejemplo: Merge

Buena parte de nuestros trabajos GIS se basan en procesar información espacial con objeto de obtener nueva información. Si queremos automatizar nuestros procesos con PyQGIS podemos abordar los trabajos de geoprocesamiento tenemos dos opciones, una compleja y una más sencilla:

  1. Accediendo a los elementos de la capa y su geometría, trabajando con cada uno de los features (objetos geográficos).
  2. A través de algoritmos de procesado de QGIS (processing)

La opción más sencilla se basa en utilizar el entorno de Procesado de QGIS.

Desde la Consola de Python podemos acceder a los algoritmos del menú de Procesado de QGIS. Utilizar los algoritmos de Procesado desde la Consola aumenta las posibilidades de estos algoritmos, pudiendo realizar operaciones más complejas, entrelazar procesos, introducir bucles y sentencias condicionales, etc.

Como ejemplo, vamos a realizar un Merge con PyQGIS de dos capas vectoriales de líneas: ríos y carreteras.

Análisis espacial con PyQGIS origen

Para ello, abriremos la Consola de Python de QGIS, y dentro de ella, introduciremos nuestras sentencias a través de la ventana intérprete.

Dentro de la Consola de Python introducimos nuestras instrucciones a través de la ventana intérprete.

Lo primero que tenemos que hacer es importar las funciones a través de la sentencia:

import processing

Ahora necesitamos saber cómo se llama el algoritmo que queremos utilizar (que no es el mismo que aparece en la caja de herramientas) para ello utilizaremos:

for alg in QgsApplication.processingRegistry().algorithms():print(alg.id())

Pero para encontrar el que necesitamos, lo más indicado es introducir dentro del código alguna referencia relativa a la herramienta, en nuestro caso de la palabra “merge”.

for alg in QgsApplication.processingRegistry().algorithms():
    if 'merge' in alg.id():
        print(alg.id())

Una vez determinada cual es la herramienta que queremos utilizar, para saber cómo introducir la sintaxis correcta utilizaremos el método algorithmHelp(), que requiere como argumento el nombre del algoritmo consultado.

processing.algorithmHelp("native:mergevectorlayers")

Resultado:

>>>processing.algorithmHelp("native:mergevectorlayers")
Unir capas vectoriales (native:mergevectorlayers)

Este algoritmo combina múltiples capas vectoriales con el mismo tipo de geometría en una sola.

Si las tablas de atributos son diferentes, la tabla de atributos de la capa resultante contendrá los atributos de todas las capas de entrada. Se añadirán nuevos atributos para el nombre y origen de la capa original.

Si alguna capa contiene valores Z o M, entonces la capa de salida también contendrá esos valores. De forma similar, si cualquiera de las capas de entrada es multiparte, la capa de salida también será multiparte.

De forma opcional se puede establecer el Sistema de Referencia de Coordenadas (SRC) de la capa combinada. Si no se establece, el SRC se tomará de la primera capa de entrada. Todas las capas se reproyectarán a este SRC.


----------------
Input parameters
----------------

LAYERS: Capas de entrada

	Parameter type:	QgsProcessingParameterMultipleLayers

	Accepted data types:
		- list[str]: lista de IDs de capas
		- list[str]: lista de nombres de capas
		- list[str]: lista de fuentes de capas
		- list[QgsMapLayer]
		- QgsProperty

CRS: SRC de destino

	Parameter type:	QgsProcessingParameterCrs

	Accepted data types:
		- str: 'ProjectCrs'
		- str: ID de la autoridad del SRC (ej. 'EPSG:3111')
		- str: SRC PROJ4 (ej. 'PROJ4:…')
		- str: WKT SRC (ej. 'WKT:...')
		- str: ID de la capa. Se usa el SRC de la capa.
		- str: nombre de capa. Se usa el SRC de la capa.
		- str: fuente de la capa. Se usa el SRC de la capa.
		- QgsCoordinateReferenceSystem
		- QgsMapLayer:  se usa el SRC de la capa.
		- QgsProcessingFeatureSourceDefinition:  se usa el SRC del origen
		- QgsProperty

OUTPUT: Combinado

	Parameter type:	QgsProcessingParameterFeatureSink

	Accepted data types:
		- str: archivo vectorial de destino, ej. 'd:/test.shp'
		- str: 'memory:' para guardar el resultado en una capa temporal en memoria
		- str: utilizando prefijo ID del proveedor vectorial y URI de destino, por ejemplo 'postgres:...' para guardar el resultado en una tabla PostGIS
		- QgsProcessingOutputLayerDefinition
		- QgsProperty

----------------
Outputs
----------------

OUTPUT:  <QgsProcessingOutputVectorLayer>
	Combinado

Y ahora que ya tenemos la ayuda sobre la sintaxis, ya podemos ejecutar la herramienta, esto lo haremos con el método run (nombre del algoritmo, parámetros) o runAndLoadResults(nombre del algoritmo, parámetros) si queremos que al acabar el algoritmo nos cargue la capa en el proyecto.

import processing

nom_layer_carret = r'C:/CURSO_PYQGIS/CAPAS/carreteras.shp'

nom_layer_rios = r'C:/CURSO_PYQGIS/CAPAS/rios.shp'

nom_resultado =
r'C:/CURSO_PYQGIS/CAPAS_PROCESADAS/elementos_lineales.shp'

parameters = {'LAYERS':[nom_layer_carret,nom_layer_rios],'CRS':'EPSG:4326','OUTPUT':nom_resultado}
feedback = QgsProcessingFeedback()

processing.runAndLoadResults('native:mergevectorlayers',parameters,feedback=feedback)

Varios consejos:

  • Utiliza variables para cada uno de los parámetros.
  • NO utilices acentos ni espacios en blanco en los nombres de las capas que vas a procesar.
  • OJO al modo de introducir las rutas, la contrabarra debe ir invertida, o preceder la cadena de texto con la letra ‘r’.

Y el resultado de la capa añadida a la TOC:

Análisis espacial con PyQGIS resultado

Siguiendo el mismo procedimiento puedes probar a realizar otros procesos como un native:clip, native:difference, native:selectbyattribute, ect…

La lista de posibilidades es tan larga como la lista de algoritmos que puedes encontrar en la caja de herramientas de procesado.

Si quieres aprender más sobre PyQGIS inscríbete a nuestro curso online de PyQGIS.

1 comentario en «Análisis espacial con PyQGIS. Ejemplo: Merge»

Los comentarios están cerrados.