Suele haber una tendencia general a vincular el uso de Python dentro de QGIS exclusivamente con el desarrollo de complementos. Sin embargo, la explotación de este popular lenguaje dentro del SIG no se limita a la programación de plugins y puede ser usado para la personalización de QGIS.
Gracias a PyQGIS , la versión ‘pythónica» de la API de QGIS, podemos realizar pequeños desarrollos, modificar la interfaz de la aplicación, crear expresiones personalizadas o crear procesos de análisis entre otras cuestiones.
En la siguiente entrada vamos a ver cómo realizar una personalización de QGIS con Python y crear una nueva herramienta que quede integrada en la barra de botones. La funcionalidad creará un grupo o conjunto de grupos de capas con el mismo nombre de las capas seleccionadas.
QGIS ya incluye por defecto la opción de añadir un grupo de capas. Nuestra nueva opción puede parecer una funcionalidad sin mucha relevancia, ya que simplemente podemos crear el grupo y luego cambiar el nombre por defecto.
Pero si este flujo se repite, y queremos asegurarnos que el nombre los grupos sea el correcto puede ser interesante automatizarla. Esto supondrá un ahorro de tiempo y mejora en nuestra productividad.
El conocimiento profesional de la API en Python de QGIS puede llevarnos al desarrollo personalizado de esta potente herramienta de análisis geográfico dentro de entornos corporativos o empresariales. Desde el Área de SIG y Desarrollo de Geoinnova podemos ayudar a profesionales y empresas en este sentido.
Usando la Consola de Python de QGIS
Al ser Python un lenguaje interpretado, podemos ejecutar las instrucciones que creemos sin necesidad de compilar usando la consola integrada de QGIS. No es la opción ideal para la personalización de QGIS con Python, pero cabe la posibilidad de manejarla para ejecutar código usando distintas clases de su API.
La consola se abre desde la barra de herramientas o bien activándose desde el menú Complementos>Consola de Python.
El código para añadir un grupo al árbol de capas del proyecto es el siguiente.

- QgsProject.instance() accede a la instancia del proyecto actual de QGIS.
- layerTreeRoot() Apunta al nodo del árbol de capas del proyecto.
- addGroup(‘grupo_capas’) creó finalmente el grupo con el nombre asignado.
La línea de código corresponde con la herramienta de QGIS «Añadir grupo». Pero como hemos comentado, nuestra intención es que el nuevo grupo tenga como nombre el de la capa que tengamos seleccionada.
Para obtener el nombre de la capa seleccionada debemos usar avanzar más en nuestro script.

- iface. Para acceder a los elementos gráficos que componen la interfaz de QGIS deberíamos usar la clase QgisInterface. Al abrir QGIS se crea por defecto el objeto iface que hace a la instancia de esta clase y que se encuentra disponible para ser usado de forma rápida.
- layerTreeView() Apunta a la ventana del árbol de capa.
- selectedLayers() Es el método para obtener una lista de las capas seleccionadas.
En esta ocasión hemos creado una variable denominada capasSeleccionadas que almacena la lista de objetos (layers). Al llamarla desde consola nos devolverá el listado de capas seleccionadas indicando su tipo y nombre.

Almacenando el código en un script
La consola Python nos sirve para lanzar fragmentos de código y que se ejecuten de forma inmediata. Pero si queremos guardar nuestra lógica, debemos crear un archivo con extensión .py.
Abriendo el editor de la consola, agregamos más opciones a nuestras líneas de código. Ahora recorreremos el listado de capas seleccionadas y crearemos un grupo para cada una de ellas. En el caso de no tener ninguna capa seleccionada, nos devuelve un aviso por consola.
layerTree = QgsProject.instance().layerTreeRoot()
selectLayers = iface.layerTreeView().selectedLayers()
if len(selectLayers) > 0:
for layer in selectLayers:
layerTree.addGroup(layer.name())
else:
print('No hay capas seleccionadas')

Añadiendo una nueva herramienta a QGIS mediante Python
Si cerramos la sesión de QGIS y queremos usar nuestra nueva herramienta, será necesario abrir el archivo Python y ejecutarla de nuevo. Sería sin duda más interesante añadir la funcionalidad a la barra de herramientas y tenerla siempre disponible.
Una de las opciones para incorporar nuevas funcionalidades es almacenarlas en un archivo denominado startup.py y situarlo en el directorio de archivos Python de la aplicación. Los datos de este fichero son leídos cada vez que se inicia QGIS, por lo tanto cargará la nueva herramienta al inicio de la sesión.
Según el sistema operativo, la carpeta donde almacenar el archivo Python es:
- Linux: .local/share/QGIS/QGIS3
- Windows: AppData\Roaming\QGIS\QGIS3
- macOS: Library/Application Support/QGIS/QGIS3
Nuestra herramienta tendrá también un icono identificativo. Para poder cargarlo, debemos almacenarlo en una ruta conocida, para el ejemplo, en una subcarpeta en la misma ubicación que startup.py.
import os
from qgis.utils import iface
from qgis.core import QgsProject
from PyQt5.QtWidgets import QAction
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QStandardPaths
def create_group_layername():
"""Añade un grupo en el árbol de capas con el nombre
de la capa seleccionada"""
layerTree = QgsProject.instance().layerTreeRoot()
selectLayers = iface.layerTreeView().selectedLayers()
if len(selectLayers) > 0:
for layer in selectLayers:
layerTree.addGroup(layer.name())
else:
iface.messageBar().pushMessage('Ups!','No hay capas seleccionadas',
level=Qgis.Warning)
icon_name = 'group.svg'
qgis_dir = QStandardPaths.standardLocations(QStandardPaths.AppDataLocation)[0]
icon_dir = 'personaltools'
icon_path = os.path.join(qgis_dir, icon_dir, icon_name)
action = QAction(QIcon(icon_path),'Crear grupo con nombre de capa')
action.triggered.connect(create_group_layername)
iface.addToolBarIcon(action)
En esta ocasión es necesario importar determinados módulos tanto generales de Python como os que permite trabajar con archivos y carpetas, de QGIS (qgis.utils y qgis.core) y aquellos que nos dan la posibilidad de trabajar con clases de la interfaz (PyQt5).
Hemos incluido el código inicial dentro de una función llamada ‘create_group_layername’. La función se ejecutará cuando hagamos clic en el nuevo botón y queda definida usando la clase QAction.
Para terminar, creamos nuestro botón (QIcon) de herramientas con icono que se añade a la barra usando el método addToolBarIcon.
En el siguiente vídeo se puede ver el funcionamiento de la nueva herramienta.

Python y QGIS, grandes aliados
Hemos visto como con unas pocas líneas de código, cómo realizar una personalización de QGIS con Python. Las posibilidades son sin duda infinitas.
A pesar de la brevedad de código y su sencilla apariencia, debemos ser conscientes que usar Python en QGIS requiere tener ciertos conocimientos de este lenguaje. Se suma a esto la necesidad de conocer la documentación de la API de QGIS y poder con ello, sacarle el máximo provecho.
Si estáis interesados en profundizar en la aplicación de Python en QGIS podéis consultar el temario de nuestro curso de PyQGIS Programación de Scripts en Python para QGIS.
¿Quieres comentarnos algo? Adelante!