• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar al pie de página
logo web Geoinnova

Geoinnova

Consultoría y Formación en SIG y Medio Ambiente

  • Geoinnova
    • Asociación
    • Equipo
    • Visor de proyectos Geoinnova
    • Geolibrería
    • Alianzas Estratégicas
  • Consultoría
    • Consultoría y Desarrollo en Sistemas de Información Geográfica
    • Consultora Ambiental
    • Turismo sostenible
    • Planificación urbana y ordenación del territorio
    • Planes Urbanos de Actuación Municipal – PUAM
    • Geomarketing
  • Servicios
    • Planero Web
    • QElectricGIS
    • Plugins
  • Formación
    • Todos los cursos
    • Webinars
    • Máster y Diplomas
    • Cursos de ArcGIS
    • Cursos de QGIS
    • Cursos de Teledetección
    • Cursos de Medioambiente
  • Medio Ambiente
    • Consultora Ambiental
    • Estudios ambientales para proyectos de energías renovables
    • Estudios de Impacto e Integración Paisajística
    • Evaluación Ambiental Estratégica de planes y programas
    • Estudio de Impacto Ambiental para proyectos
    • Cálculo huella de carbono
    • Educación Ambiental
    • Cursos de Medioambiente
  • Coworking
  • Blog
    • SIG
    • Medio Ambiente
    • Teledetección
    • Programación y Desarrollo SIG
    • Corporativo
  • Contacto
    • Soporte de Clientes – Tickets
Programación y Desarrollo SIG

Expresiones personalizadas con el editor de funciones de QGIS

11/02/2021 Deja un comentario

Todos los que trabajamos con herramientas SIG, nos hemos encontrado alguna vez con un problema de análisis espacial básico que no hemos sabido resolver, no por falta de medios, sino por no conocer bien las posibilidades de nuestro software.

Algunas de estas necesidades puntuales, son relativamente fáciles desde el punto de vista de la lógica espacial. Sin embargo, no sabemos cómo plasmar esos resultados en un campo de forma automática (por ejemplo).

Pues bien, a través de QGIS tenemos distintas alternativas. Una de ellas y que ofrece potentes funcionalidades, es la posibilidad de crear y añadir funciones propias, que pueden ser integradas como expresiones personalizadas. Estas pueden ser añadidas a través del editor de funciones, utilizando instrucciones específicas en Python.

¿Dónde encontrar el editor de funciones de QGIS?

El editor de funciones de QGIS puede encontrarse en cualquier herramienta de trabajo con expresiones, como la Calculadora de Campos o bien la Búsqueda o Selección de geometrías pro expresión.

Editor de funciones
Cuadro de dialogo de funciones en QGIS

Si pulsamos sobre el editor de funciones, se nos abrirá la ventana del editor. En esta (si no tenemos aún alguna función personalizada), nos debería aparecer una única función de muestra llamada “default”. Esta no tiene mayor importancia y es utilizada a modo de ejemplo por QGIS.

Editor de  funciones QGIS
Calculadora de campos

Para crear una nueva función, vamos a pulsar sobre el icono (+) que aparece en verde en la parte inferior izquierda. Tras hacer clic para crear una nueva función, tendremos que introducir un nombre para esta.

Cuadro de diálogo
Cuadro de diálogo donde insertamos el nombre de la función que creamos

Tras introducir el nombre de la función, aparecerá un pequeño código de ejemplo. Este deberá ser modificado y guardaremos el código presionando sobre “Guardar y cargar funciones”.

código de ejemplo
Código de ejemplo

Función personalizada: añadir nombres de geometrías que intersectan de otra capa

Vamos a crear una función que permita, al usuario, obtener en un nuevo campo, el nombre de las geometrías que intersectan de otra capa. En el caso de que múltiples elementos intersecten en nuestra geometría, los nombres podrán ser concatenados utilizando un separador personalizado.

A continuación, vamos a ir explicando el código paso a paso.

Lo primero es importar los módulos que vamos a requerir en la función. Para ello utilizamos las siguientes instrucciones en la parte inicial:

 from qgis import *
 from qgis.core import *
 from qgis.gui import * 

Una vez importados los módulos necesarios, vamos a empezar con la parte principal de la función. Uno de los pasos imprescindibles es indicar el parámetro args y el parámetro group. El primero lo dejaremos como ‘auto’ para indicar que utilice los parámetros que vamos a definir en la función Python y en el segundo parámetro vamos a introducir el nombre del menú sobre el que se integrará la función.

@qgsfunction(args='auto', group='Funciones Propias')

Los menús por defecto son los que aparecen en la imagen a continuación:

Calculadora de campos
Menú dentro de la calculadora de campos

Si indicamos un nombre de menú que no aparece en el listado, este se creará y añadirá de forma automática.

Para crear la función vamos a utilizar la siguiente estructura de encabezado y prestaremos especial atención a esta parte.

def add_intersect_names(layer, field_copy, separator, feature, parent):
def: palabra reservada en Python para crear una función
add_intersect_names: nombre que vamos a dar a nuestra función
layer, field_copy, separator: parámetros de entradalayer: nombre de la capa de intersección
field_copy: campo desde el que queremos obtener el valor a seleccionar
separator: separador (en el caso de haber múltiples intersecciones, se concatenarán los elementos con este separador)
feature: es el objeto QgsFeature que contiene los datos de geometría y atributos del elemento (obligatorio)
parent: refiere a la clase desde la que se hereda (obligatorio)

Dentro de la función y prestando especial atención a la identación, vamos a introducir las instrucciones que permiten dar sentido a nuestra función.

     layer_int= QgsProject.instance().mapLayersByName(layer)[0]
     feature_name_int= list()
     for f1 in layer_int.getFeatures():
         if f1.geometry().intersects(feature.geometry()):
             feature_name_int.append(f1[field_copy])
     if len(feature_name_int) > 0:
         return str(separator.join(feature_name_int))
     else:
         return '' 

Con la ayuda de estas líneas:

  1. Seleccionamos la capa de intersección.
  2. Creamos una lista vacía
  3. Recorremos las geometrías de la capa introducida y comprobamos la intersección con nuestra geometría objetivo.
    • Si hay intersección, se añade el nombre del campo indicado en la lista.
  4. Si la longitud de la lista es superior a 0 (hay intersección), se copian los distintos elementos.
  5. Si no hay elementos que intersecten con nuestra geometría se devolverá un valor en blanco

Una vez creada y editada nuestra función, debemos guardar los cambios.

Puedes encontrar el código completo aquí:

 from qgis import *
 from qgis.core import *
 from qgis.gui import *
 @qgsfunction(args='auto', group='Funciones Propias')
 def add_intersect_names(layer, field_copy, separator, feature, parent):
     layer_int= QgsProject.instance().mapLayersByName(layer)[0]
     feature_name_int= list()
     for f1 in layer_int.getFeatures():
         if f1.geometry().intersects(feature.geometry()):
             feature_name_int.append(f1[field_copy])
     if len(feature_name_int) > 0:
         return str(separator.join(feature_name_int))
     else:
         return '' 

¿Cómo utilizar la función?

En este ejemplo vamos a cargar la capa de Espacios Naturales Protegidos de España (obtenida en la página del Ministerio para la Transición Ecológica y el Reto Demográfico) y la capa de Provincias de España (obtenida en la página del Centro Nacional de Información Geográfica).

El objetivo será obtener el nombre de las provincias que intersectan con cada uno de nuestros ENP. Para garantizar el correcto funcionamiento de la función, vamos a utilizar la función fixgeometries, conocida como Corregir Geometrías.

Para ello vamos a utilizar la Calculadora de Campos. En esta vamos a indicar que queremos crear un nuevo campo con el nombre “Prov” de tipo texto y con una longitud de 255. Para hacer uso de nuestra función, vamos a introducir el nombre exacto de la función y los parámetros necesarios, a excepción de los parámetros obligatorios, que no son necesarios:

add_intersect_names('Recintos_Provinciales','NAMEUNIT', ', ')
Calculadora de campos
Calculadora de campos donde aparece la herramienta creada

A continuación, podemos observar el resultado. Ya tenemos en una columna todas las provincias que intersectan en nuestra capa de Espacios Naturales Protegidos.

Tabla resultante de ejecutar la herramienta generada

Si te ha gustado este post y quieres saber más sobre funcionalidades Python en QGIS, matricúlate en nuestros cursos de PyQGIS: Programación de Scripts en Python para QGIS o  Python para ArcGIS y QGIS: Geoprocesos con ArcPy y PyQGIS.

Apúntate a nuestra newsletter semanal

"*" señala los campos obligatorios

Consentimiento*
*
Este campo es un campo de validación y debe quedar sin cambios.

Información legal

Cumplimos el RGPD (Reglamenteo General de Protección de Datos) y esta en la primera información que debes saber. Responsable: Asociación Geoinnova. Finalidad: Apuntarte en nuestra base de datos para poder enviarte nuestra newsletter y cualquier otra información de interes. Legitimidad: Nos das tu consentimiento para comunicarnos contigo. Derechos: Tienes derecho a acceder, rectificar, limitar y suprimir tus datos. Para una información más ampliada entra a nuestra política de privacidad.

Artículos relacionados

MapLibre GL JS: Crear mapa y añadir datos desde un GeoJSON
22/11/2022
Cómo trabajar con nuestra base de datos PostgreSQL usando psql
08/11/2022
DBeaver: software para la gestión de bases de datos
20/10/2022

RemOT Technologies

RemOT Technologies es una empresa colaboradora de Geoinnova, especialista en desarrollo de aplicaciones GIS para la web, cartografía y análisis espaciales automatizados. Desarrolla visores web cartográficos, aplicaciones basadas en geolocalización y plugins y personalizaciones de QGIS para resolver problemas de distintos ámbitos, como por ejemplo la gestión de parcelas o la gestión de redes. RemOT ya ha trabajado en varios proyectos de desarrollo de la mano de Geoinnova y, además, también ha participado, entre otros proyectos como en el desarrollo del Atlas Nacional de España. Ha sido reconocida como una de las 100 mejores empresas geoespaciales del mundo en el año 2019 por Geoawesomeness, una de las 50 Startup españolas de futuro por la revista Emprendedores y posee el sello Pyme Innovadora del Ministerio de Ciencia Innovación y Universidades. En la parte dedicada a formación, Lucía Martínez, Marcos Gimeno y Miquel Febrer, imparten diversos cursos en la plataforma de Geoinnova.

Interacciones con los lectores

¿Quieres comentarnos algo? Adelante! Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Footer

Menú Legal

  • Aviso Legal
  • Política de privacidad
  • Política de cookies
  • Términos y condiciones

Otras páginas de interes

  • Promociones y descuentos en formación
  • Formación bonificada FUNDAE

Contacto

Calle Luis Morondo Urra nº 8 Bajo A
31006 Pamplona (Navarra)
info@geoinnova.org
+34 948 117 137

Horario de atención

Lunes a Viernes - 09:00 a 14:00 y de 16:00 a 19:00.
Fines de semana y Festivos - Exclusivamente por mail.
Horario de Verano (01 de julio al 30 de agosto): De lunes a viernes de 8 a 15h.
Entidad adherida a Confianza Online Certificado de inscripción en el Registro de huella de carbono, compensación y proyectos de absorción Logo Plazox

© 2023 · Desarrollada por Geoinnova en colaboración con OikosMSP

Gestionar el Consentimiento de las Cookies
Utilizamos tecnologías como las cookies para almacenar y/o acceder a la información del dispositivo. Lo hacemos para mejorar la experiencia de navegación y para mostrar anuncios personalizados. El consentimiento a estas tecnologías nos permitirá procesar datos como el comportamiento de navegación o las identificaciones únicas en este sitio. No consentir o retirar el consentimiento, puede afectar negativamente a ciertas características y funciones.
Funcional Siempre activo
El almacenamiento o acceso técnico es estrictamente necesario para el propósito legítimo de permitir el uso de un servicio específico explícitamente solicitado por el abonado o usuario, o con el único propósito de llevar a cabo la transmisión de una comunicación a través de una red de comunicaciones electrónicas.
Preferencias
El almacenamiento o acceso técnico es necesario para la finalidad legítima de almacenar preferencias no solicitadas por el abonado o usuario.
Estadísticas
El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos. El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos anónimos. Sin una requerimiento, el cumplimiento voluntario por parte de su proveedor de servicios de Internet, o los registros adicionales de un tercero, la información almacenada o recuperada sólo para este propósito no se puede utilizar para identificarlo.
Marketing
El almacenamiento o acceso técnico es necesario para crear perfiles de usuario para enviar publicidad, o para rastrear al usuario en un sitio web o en varios sitios web con fines de marketing similares.
Administrar opciones Gestionar los servicios Gestionar proveedores Leer más sobre estos propósitos
Preferencias
{title} {title} {title}