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 el número de zona UTM de una entidad de mapa y usaremos esta función para escribir un expresión que muestra la zona UTM como una nota de mapa cuando se pasa por encima del punto.

Otras habilidades que aprenderá

  • Como usar la herramienta Notas 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)

Procedimiento

  1. Ubique el archivo ne_10m_populated_places_simple.zip en el Navegador QGIS y expándalo. Seleccione el archivo ne_10m_populated_places_simple.shp y arrástrelo a la pantalla.

../../_images/170.png
  1. Vaya a Editar ‣ Seleccionar ‣ Seleccionar Entidades Por Expresión… o clic en el botón Seleccionar entidades usando una expresión en la Barra de Herramientas Atributos.

../../_images/239.png
  1. En el diálogo Seleccionar por Expresión, cambie a la pestaña Editor de Función. Aquí podrás escribir cualquier código PyQGIS que será ejecutado por el motor de expresión.

../../_images/327.png
  1. Definiremos una función personalizada llamada GetUtmZone que calculará el número de zona UTM para cada objeto espacial. Debido a que las funciones personalizadas en QGIS trabajan a nivel de objeto espacial. Usaremos el centroide de la geometría del objeto espacial y calcularemos la Zona UTM a partir de la latitud y longitud de la geometría del centroide. También agregaremos una designación “N” o “S” a la zona para indicar si la zona está en el hemisferio norte o sur. Presione el botón + abajo a la izquierda de la pantalla y escriba utm_zones.py como el nombre de archivo. Puedes hacer clic en el Help en el panel de abajo para cerrar y expandir el panel de código.

../../_images/4.gif
  1. Las Zonas UTM son una proyección longitudinal numerada de 1 a 60. Cada zona UTM tiene un ancho de 6 grados. Aquí usaremos una fórmula matemática para encontrar la zona apropiada para un valor dado de longitud. Esta fórmula funciona para todas excepto una pocas zonas UTM especiales. Escriba el siguiente código en la ventana del editor. Cuando haya terminado, clic en Guardar y Cargar Funciones.

    import math
    from qgis.core import *
    from qgis.gui import *
    
    @qgsfunction(args=0, group='Custom', usesgeometry=True)
    def GetUtmZone(value1, feature, parent):
        """Return the UTM Zone of the feature's geometry as a String"""
        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/511.png

Nota

Actualmente no hay manera de borrar un archivo de expresión desde el IGU. Si desea borrar el archivo utm_zone.py, puede ir a Configuración ‣ Perfiles de Usuario ‣ Abrir Carpeta de Perfil Activo y borrar el archivo desde python ‣ expresiones.

  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 Funciones. 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 33N. Clic Acercamiento a Entidades y el mapa cambiará, si hace clic en Seleccionar Entidades debería ver cambiar los puntos en la zona UTM 33N a amarillo.

    GetUtmZone() = '33N'
    
    ../../_images/611.png

Nota

Debido a un error, esta funcionalidad no trabajaba en versiones previas a QGIS3. Ha sido corregida desde la versión 3.4.5 en adelante.

  1. De vuelta en la ventana principal QGIS, debería ver algunos puntos resaltados en amarillo. Estos son puntos que caen en la Zona UTM que especificamos en la expresión.

    ../../_images/711.png
  2. Usted vio como definimos y usamos una función para seleccionar objetos espaciales 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 un objeto espacial. Clic-derecho en la capa ne_10m_populated_places_simple y seleccione Propiedades.

    ../../_images/811.png
  3. Cambie a la pestaña Despliegue. 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 o expresiones de un campo de la capa para definir un mensaje mucho más útil. Clic sobre el botón Ɛ.

    ../../_images/911.png
  4. 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 GetUtmZone. Ingrese la siguiente expresión y clic Aceptar.

    concat("name",' | UTM Zone: ', GetUtmZone())
    
    ../../_images/1015.png
  5. Verá la expresión ingresada como el valor del texto Despliegue. Clic en Insert para agregarlo a la caja HTML y luego presiona Aceptar.

    ../../_images/1118.png
  6. Antes que procedamos, deseleccionemos los objetos espaciales que fueron seleccionados en el paso previo. Vaya a Editar ‣ Seleccionar ‣ Deseleccionar Entidades de Todas las Capas o clic al botón Deseleccionar Entidades de Todas las Capas en la Barra de Herramientas de Atributo.

    ../../_images/1216.png
  7. Active la herramienta Avisos de Mapa yendo a Vista ‣ Avisos de Mapa o haciendo clic en el botón Mostrar Avisos de Mapa en la Barra de Herramientas de Atributos.

    ../../_images/1314.png
  8. 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/14.gif

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