Usando Funciones de Expresión Personalizadas de Python

Advertencia

Una nueva versión de este tutorial está disponible en Usando Funciones de Expresión Python Personalizadas (QGIS3)

Las expresiones en QGIS tiene bastante poder y son usadas en varias funcionalidades centrales: selección, cálculo de valores de campo, estilo, etiquetado, etc. QGIS también tiene soporte para expresiones definidas por el usuario. Con un poco de programación python, puedes definir tus propias funciones que pueden ser usadas dentro del motor de expresión.

Vista general de la tarea

Definiremos una función personalizada que encuentra la Zona UTM de una entidad de mapa y usaremos esta función para escribir una expresión que muestra la zona UTM como un aviso de mapa cuando se pase por encima del punto.

Otras habilidades que aprenderás

  • Como usar la herramienta Avisos de Mapa para mostrar texto personalizado cuando se pasa por encima de una entidad.

Obtener los datos

Usaremos el conjunto de datos Lugares Poblados de Natural Earth. Descargue el conjunto de datos simple (menos columnas)

Para su comodidad, puede descargar directamente una copia de los conjuntos de datos de los enlaces abajo:

ne_10m_populated_places_simple.zip

Procedmiento

  1. Abra QGIS y vaya a Capas ‣ Agregar Vector ‣ Agregar Capa Vectorial.

../_images/1176.png
  1. Navegue al archivo descargado ne_10m_populated_places_simple.zip y clic en Abrir.

../_images/2145.png
  1. Vaya a Vista ‣ Seleccionar ‣ Seleccionar Por Expresiones….

../_images/386.png
  1. Cambie a la pestaña Editor de Funcción. Aquí puede escribir cualquier código PyQGIS que será ejecutado por el motor de expresión.

../_images/453.png
  1. Definiremos una función personalizada llamada GetUtmZone que calculará el número de zona UTM para cada entidad. Debido a que las funciones personalizadas en QGIS trabajan a nivel de entidad, usaremos el centroide de la geometría de la entidad y calcularemos la Zona UTM de la latitud y longitud de la geometría del centroide. También agregaremos la designación “N” o “S” a la zona para indicar si la zona está en el hemisferio norte o sur. Escriba el código siguiente en el editor, ingrese el nombre del archivo como utm_zones.py y clic Guardar archivo.

Nota

Las Zonas UTM son zonas de proyección longitudinal numeradas des 1 a 60. Cada zona UTM tiene un ancho de 6 grados. Aquí usaremos una fórmula matemática simple para encontrar la zona apropiada para un valor dado de longitud. Note que esta fórmula no cubre algunas zonas UTM especiales.

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

@qgsfunction(args=0, group='Custom', usesgeometry=True)
def GetUtmZone(value1, feature, parent):
    centroid = feature.geometry()
    longitude = centroid.asPoint().x()
    latitude = centroid.asPoint().y()
    zone_number = math.floor(((longitude + 180) / 6) % 60) + 1

    if latitude >= 0:
        zone_letter = 'N'
    else:
        zone_letter = 'S'

    return '%d%s' % (int(zone_number), zone_letter)
../_images/546.png
  1. Clic Ejecutar Script. Esto ejecutará el código python y registrará la función GetUtmZone con el motor de expresión. Note que esto necesita hacerse sólo una vez. Una vez que la función está registrada, siempre estará disponible al motor de expresión.

../_images/644.png
  1. Cambie a la pestaña Expresión en el diálogo Seleccionar por expresión. Encuentre y expanda el grupo Personalizado en la sección Funcciones. Notará una nueva función personalizada $GetUtmZone en la lista. Ahora podemos usar esta función en las expresiones justo como cualquier otra función. Escriba la siguiente expresión en el editor. Esta expresión seleccionará todos los puntos que caen en la Zona UTM 40N. Clic Seleccionar.

$GetUtmZone = '40N'
../_images/744.png
  1. De vuelta en la ventana principal QGIS, verá algunos puntos resaltados en amarillo. Estos son puntos que caen en la Zona UTM que especificamos en la expresión.

../_images/843.png
  1. Usted vio como definimos y usamos una función para seleccionar entidades por expresión. Ahora usaremos la misma función en otro contexto. Una de las gemas escondidas en QGIS es la herramienta Aviso de Mapa. Esta herramienta muestra texto definido por el usuario cuando pasas por encima de una entidad. Clic-derecho en la capa ne_10m_populated_places_simple y seleccione Propiedades.

../_images/944.png
  1. Cambie a la pestaña Mostrar y seleccione HTML. Aquí puede ingresar cualquier texto que será mostrado cuando pase por encima de las entidades de la capa. Aún mejor, puede usar los valores y expresiones de un campo de la capa para definir un mensaje mucho más útil. Clic sobre el botón Insertar expresión….

../_images/1051.png
  1. Verá de nuevo el familiar editor de expresión. Usaremos la función concat para unir el valor del campo name y el resultado de nuestra función personalizada $GetUtmZone. Ingrese la siguiente expresión y clic Aceptar.

concat("name", ' | UTM Zone: ', $GetUtmZone)
../_images/1177.png
  1. Verá la expresión entrada como el valor del texto Mostrar. Clic en Aceptar.

../_images/1253.png
  1. Antes de proceder, deseleccionemos las entidades que fueron seleccionadas en el paso previo. Vaya a Vista ‣ Seleccionar ‣ Deseleccionar Entidades de Todas las Capas.

../_images/1351.png
  1. Active la herramienta Avisos de Mapa yendo a Vista ‣ Avisos de Mapa.

../_images/1448.png
  1. Acérquese a cualquier área del mapa y ponga el cursor del ratón sobre cualquier entidad. Verá el nombre de la ciudad y la zona UTM correspondiente mostradas como el aviso del mapa.

../_images/1544.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)