Hace unas semanas os enseñábamos cómo crear expresiones personalizadas con el editor de funciones de QGIS. Pues bien, hoy vamos a ver cómo automatizar procesos muy sencillos que a la larga nos permitirán ahorrar muchísimo tiempo. Vamos a añadir los archivos shp de una carpeta a nuestro proyecto de forma automática usando PyQGIS, Phyton en QGIS.
Al trabajar con Sistemas de Información Geográfica (SIG), todos nos hemos encontrado con la necesidad de aplicar un mismo proceso a múltiples capas de información. Nos encontramos ante un proceso repetitivo que puede hacernos perder bastante tiempo.
Pues bien, a través de PyQGIS, tenemos la posibilidad de conseguir que ese procedimiento repetitivo y tedioso, pueda ser programado en unas pocas líneas de código y que dediquemos nuestro preciado tiempo a otras labores más importantes.
Abrir la consola de Python en QGIS
Para acceder a la consola de Python en QGIS, simplemente debemos buscar el icono de Python (figura Python), que aparece en nuestra barra de herramientas. O bien navegar hasta la pestaña superior de “Complementos” y buscar “Consola de Python”, que aparece junto al mismo icono.

Desde la consola de Python podremos acceder al editor a través del icono

Y se nos abrirá en la parte derecha la ventana sobre la que vamos a escribir nuestras instrucciones.

Listar capas shp de una carpeta
Para empezar, debemos identificar la ruta de nuestra carpeta.

En este caso, vamos a crear una variable llamada p_folder y que hará referencia a la ruta completa o absoluta a nuestra carpeta.
p_folder = "E:/SHP/QGIS/"
Con la ayuda del módulo os, vamos a utilizar la función listdir() para obtener el nombre de todos los archivos de nuestra carpeta. Para ello utilizaremos la siguiente instrucción:
list_files = os.listdir(p_folder)
Guardaremos esos archivos en un objeto llamado list_files y podremos aplicar la función print() para comprobar que efectivamente nos devuelve todos los archivos.
print(list_files)
['Aragon.cpg', 'Aragon.dbf', 'Aragon.prj', 'Aragon.qpj', 'Aragon.shp', 'Aragon.shx', 'ENP.cpg', 'ENP.dbf', 'ENP.prj', 'ENP.qpj', 'ENP.shp', 'ENP.shx', 'Municipios.dbf', 'Municipios.prj', 'Municipios.sbn', 'Municipios.sbx', 'Municipios.shp', 'Municipios.shx', 'Red_fluvial.cpg', 'Red_fluvial.dbf', 'Red_fluvial.prj', 'Red_fluvial.qpj', 'Red_fluvial.shp', 'Red_fluvial.shx']
Podemos ver como a través de la función os.listdir(), nos ha devuelto un objeto de tipo lista con todos los archivos que tenemos en nuestra carpeta. Aunque todos ellos forman parte de la estructura Shapefile, será el archivo “.shp” sobre el que tengamos que trabajar. Para ello, vamos a utilizar una serie de instrucciones muy básicas para verificar que el fichero seleccionado es de ese tipo.
Primero, vamos a definir la extensión de nuestro fichero y vamos a guardarla en un objeto llamado extensión (sin acento).
extension = ".shp"
Ahora vamos a listar todos los objetos de nuestra lista y con la ayuda de la función splitext() del módulo os. Este devuelve un objeto dónde el primer elemento corresponde al nombre base del archivo [0] y el segundo corresponde a la extensión [1]. Seleccionamos el segundo y comprobamos que efectivamente es igual a la extensión definida.
for f in list_files:
if os.path.splitext(f)[1] == extension:
print(f)
Ahora ya sabemos que nuestro archivo tiene por extensión “shp” y ya podemos crear la ruta completa al mismo. Para ello, simplemente vamos a crear una nueva variable llamada abs_path concatenando la ruta a la carpeta y el nombre base completo de nuestro archivo. Además, vamos a devolver por pantalla la ruta.
abs_path = p_folder+f
print(abs_path)
¿Cómo añadir un SHP a la interfaz de PyQGIS?
Tras haber identificado los archivos que queremos añadir a nuestra interfaz, ya tenemos todo listo para poder incorporar esos archivos a la vista de QGIS. Para ello, debemos utilizar el método addVectorLayer de la clase QgisInterface. Esta requiere tres parámetros:
- Ruta al archivo que queremos añadir
- Nombre del archivo (nombre con el que vamos a ver la capa en la interfaz)
- Proveedor de datos (para archivos con extensión “shp”, utilizaremos siempre “ogr”)
Cada uno de estos tres parámetros tiene que ser definido para añadir las distintas capas. Vamos a automatizar este proceso utilizando las variables ya tratadas hasta el momento. Para ello, vamos a utilizar la siguiente instrucción:
layer = iface.addVectorLayer(abs_path, os.path.splitext(f)[0], 'ogr')

Ya tenemos listo nuestro código. Ahora, podemos lanzar el procedimiento pulsando sobre el siguiente icono del editor.

Tras lanzar el procedimiento, podremos ver como se comprueban todos los archivos de la carpeta y, en el caso de que la extensión sea la definida, estos serán añadidos a la interfaz gráfica de QGIS de forma automática.

A continuación os dejamos el código completo:
p_folder = "E:/SHP/QGIS/"
list_files = os.listdir(p_folder)
print(list_files)
extension = ".shp"
for f in list_files:
if os.path.splitext(f)[1] == extension:
print(f)
abs_path = p_folder+f
print(abs_path)
layer = iface.addVectorLayer(abs_path, os.path.splitext(f)[0], 'ogr')
Aunque este procedimiento es muy simple, se plantea como base sobre la que empezar a construir desarrollos más complejos. Con unas pocas líneas más, podremos desarrollar tareas mucho más complejas que nos faciliten el día a día en el mundo gis.
Si te ha gustado este post y quieres saber más sobre funcionalidades Python en QGIS, no te pierdas nuestros cursos de: Curso PyQGIS : Programación de Scripts en Python para QGIS y Curso Python para ArcGIS y QGIS: Geoprocesos con ArcPy y PyQGIS
Hola!
Muchas gracias por el artículo. En la línea 8 del código, la variable abs_path debiera definirse como
abs_path = p_folder+»/»+f
De otra forma, no abrirá el archivo.
Hola Esteban, me podrías decir cómo escribir la barra? justo estoy tratando de abrir unos archivos con este script, sin éxito,,, gracias!
Buenos días,
Si utilizas Windows, en la línea 8, los usuarios de Windows deben definir la variable como:
abs_path = p_folder + ‘\\’ + f
Sino le faltará una barra diagonal a la dirección del archivo.