Introducción al desarrollo con PyQGIS

Germán Carrillo

Introducción al desarrollo con PyQGIS

2020

Introducción

2da Jornada de Talleres

"Creemos que por lo menos algunos analistas realmente necesitarán aprender a programar.

Piensa en ello como aprendiendo a cocinar. Puedes preferir pasta fresca a macarrones gratinados en caja, pero si no quieres quedar atrapado comiendo la última, debes aprender a cocinar o pagar a alguien más para que lo haga por ti.

Aprender a programar es como aprender a cocinar de otra manera: puede ser un proceso muy gradual. Un día estás sentado comiendo tus macarrones gratinados y decides mejorarlos con un poco de Tabasco, mostaza o salsa inglesa. Bingo! Pronto estarás poniéndole además queso rallado. (Continúa...)

Introducción

3ra Jornada de Talleres Internos

(...) Descubres que los ingredientes que compras para un plato pueden ser mezclados para hacer otro. Empiezas a quedarte un rato en el pasillo de las especias en el supermercado. La gente empieza a comprarte utensilios de cocina. Llegas al punto donde eres capaz de experimentar con recetas.

Aunque pocas personas se conviertan en chefs, muchos aprenden a cocinar suficientemente bien para satisfacer sus propias necesidades.


Si no programas, tu proceso de investigación siempre estará a merced de aquellos que lo hacen."

Traducido de http://sgillies.net

Introducción

3ra Jornada de Talleres Internos

Así como en la cocina, en programación se cometen errores...

Introducción

3ra Jornada de Talleres Internos

Así como en la cocina, en programación es normal olvidar ingredientes, y es normal recurrir a la documentación, o incluso al código de otros...

Python

Introducción a Python

Guido van Rossum, principios de 90's
Inspirado en 'Monthy Python'
Lenguaje interpretado (semi)
Tipado dinámico y fuertemente tipado
Multiplataforma
Sintaxis sencilla que lo hace muy legible

3ra Jornada de Talleres Internos

Bases de Python

¡Escribamos algo de Python!

3ra Jornada de Talleres Internos

Intérprete de Python

Tipos de datos

Condicionales y ciclos

Funciones

PyQGIS

3ra Jornada de Talleres Internos

Introducción

3ra Jornada de Talleres Internos

Recursos y documentación

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

¿Dónde usar Python en QGIS?

1. Consola de Python y editor de scripts

Ctrl

+

Alt

+

P

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

2. Macros del proyecto

Proyecto --> Propiedades...

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

3. Acciones

Propiedades de la capa --> Acciones

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

4. Expresiones personalizadas en Python

Diálogo de expresiones --> Editor de Funciones

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

5. Algoritmos de Geoprocesamiento

Ventana de Procesamiento --> Scripts

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

6. Plugins

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

7. Scripts 'standalone' (sin la GUI de QGIS)

3ra Jornada de Talleres Internos

¡¡¡Empecemos!!!

1. Consola de Python y editor de scripts

3ra Jornada de Talleres Internos

Pero antes de empezar...

¡Necesitamos saber qué es una clase y qué es un objeto!

3ra Jornada de Talleres Internos

Programas más comprensibles y más fáciles de mantener.
¡Se basa en Objetos!
Los objetos:

3ra Jornada de Talleres Internos

Programación Orientada a Objetos

      Representan mejor la complejidad del mundo real.
      Tienen estado y comportamiento.
      Interactúan con otros objetos.

Caso 1: Aplicaciones gráficas (Qt5).

     Los objetos son: ventanas, botones, diálogos, etc.
Caso 2: Aplicación para SIG (QGIS).

 


Conclusión:

3ra Jornada de Talleres Internos

Y... ¿Qué son los objetos?

"Un objeto es la representación de un concepto

en el sistema."

Los objetos son: tablas, capas vectoriales, capas ráster, un mapa, la simbología de una capa, botón 'Acercar', etc.

Un objeto es una representación. Es concreto y particular.
    Ejemplo: Botón “Acercar mapa”, Botón "Panear".

3ra Jornada de Talleres Internos

Clases y objetos

Las clases se agrupan en librerías:
    Ejemplo: Librería Controles gráficos de usuario (GUI).

Incluso se puede hablar de cosas más generales, esto es,  

    de clases más abstractas. Ejemplo: Clase Botón.

Para conceptos (generales) se habla de Clases.
    Ejemplo: Clase Botón de navegación.

Conceptos (abstractos) del sistema.
Pueden actuar como moldes o prototipos para crear objetos.
Tienen propiedades y métodos.

3ra Jornada de Talleres Internos

Clases

     La clase Botón puede tener...

         Propiedades como: Size, Text, Icon
         Métodos como: run()

     El objeto Botón "Acercar mapa" también tiene:

           Size (32x32), Text (""), Icon (acercar.png), run() (acercar.py)

Los objetos de una clase, heredan sus propiedades y métodos.

3ra Jornada de Talleres Internos

Concluyendo sobre clases y objetos

Clase    (Concepto, plantilla, molde)
 

 

Objeto (Instancia de una clase)

Imágenes: https://www.iconfinder.com/icons/4835095/code_coding_page_programming_web_web_page_icon     

      https://www.iconfinder.com/icons/618630/bubble_dream_happy_idea_speech_talk_think_icon

Comunicación con QGIS

Cuando abrimos QGIS, podemos acceder a sus objetos

3ra Jornada de Talleres Internos

QgisInterface

iface

Escribiendo código en PyQGIS

Escribamos código Python para manipular información

geográfica...

 

 

 

3ra Jornada de Talleres Internos

Usando iface

Accediendo a capas y a sus propiedades

Creando campos

Análisis espacial (cruce de capas)

Modificando capas

1. Consola de Python y editor de scripts

2. Macros del proyecto

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

Macros del proyecto

Fuente: https://definicion.de/macro/

"[...] secuencia de instrucciones almacenadas para posibilitar la ejecución organizada de una orden. Esto quiere decir que una macroinstrucción permite que una única orden desencadene una secuencia de varias instrucciones.

...

[...] Es posible almacenar una macro en el propio software en el que se ejecuta, ya sea mediante un botón o una cierta combinación de teclas."

3ra Jornada de Talleres Internos

Macros del proyecto

3ra Jornada de Talleres Internos

openProject()

saveProject()

closeProject()

Macros del proyecto: openProject()

3ra Jornada de Talleres Internos

Cuando se abra este proyecto... abrir la consola de Python!

Fuente: https://gis.stackexchange.com/a/132714/4972

Macros del proyecto (discusión)

3ra Jornada de Talleres Internos

¿Otros casos de uso?

openProject()

saveProject()

closeProject()

¿Y si quiero una acción para todos mis proyectos?

Script startup.py

3ra Jornada de Talleres Internos

Script para ejecutar código Python cada vez que inicia QGIS.

 

¿Dónde guardar el script?

/home/USER/.local/share/QGIS/QGIS3/

startup.py

C:\Users\USER\AppData\Roaming\QGIS\QGIS3\

Script startup.py: Ejemplo

3ra Jornada de Talleres Internos

import qgis
from console import console

def open_console():
    if not console._console:
        # Initialize the console (QGIS knows how)
        qgis.utils.iface.actionShowPythonDialog().trigger()
        
    console._console.setVisible(True)

qgis.utils.iface.initializationCompleted.connect(open_console)

Fuente: https://gis.stackexchange.com/a/132714/4972

¿Dónde usar Python en QGIS?

1. Consola de Python y editor de scripts

2. Macros del proyecto

3. Acciones

3ra Jornada de Talleres Internos

Acciones

3ra Jornada de Talleres Internos

Capa

Feature (objeto)

Lienzo (mapa)

Campo

Acciones: Ejemplo 1, Wikipedia

3ra Jornada de Talleres Internos

Acciones: Ejemplo 2, mismo valor

3ra Jornada de Talleres Internos

1. Consola de Python y editor de scripts

2. Macros del proyecto

3. Acciones

4. Expresiones personalizadas en Python

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

Buena forma de automatizar en QGIS... ¡sin programar!

 

Conjunto de funciones disponibles para seleccionar, filtrar, combinar, formatear, convertir, calcular, ...,  y agregar valores en QGIS.

 

Hay condicionales y también variables globales, del proyecto, de la capa, del usuario, etc.

 

¡Están por todos lados en QGIS!

 

A veces (muy pocas veces) NO encontramos la que necesitamos.

¡Pero podemos crear nuestras propias funciones... con Python!

3ra Jornada de Talleres Internos

Expresiones

Editor de funciones

3ra Jornada de Talleres Internos

Expresiones personalizadas

Diálogo de expresiones --> Editor de Funciones

Ejemplo: Dado un punto, obtener su valor de altura desde DEM

3ra Jornada de Talleres Internos

Expresiones personalizadas

from qgis.core import (qgsfunction, QgsProject, QgsRaster)

@qgsfunction(args='auto', group='Custom', usesgeometry=True)
def get_elevation(feature, parent):
    layers = QgsProject.instance().mapLayersByName("DEM")
    if layers: # Any layer called DEM?
        rLayer = layers[0]
        geom = feature.geometry()
        geom.convertToSingleType()  # Single points are required
        ident = rLayer.dataProvider().identify(geom.asPoint(), 
                                               QgsRaster.IdentifyFormatValue)
        if ident.isValid():
            return ident.results()[1]  # Read from band 1
    return NULL
raster_value('DEM', 1, $geometry)

Tiempo después...

Ejemplo 2: Obtener un código QR

                    (usado para los certificados de QGIS Colombia)

3ra Jornada de Talleres Internos

Expresiones personalizadas

from qgis.core import (QgsProject, NULL, qgsfunction)

@qgsfunction(args='auto', group='Custom')
def qr(evento, taller, cc, feature, parent):
  if evento and taller and cc:
    import os, qrcode
    base_dir = QgsProject.instance().fileInfo().path()
    qr_dir = os.path.join(base_dir, "qr")
    filename = "{}-{}-{}".format(evento, taller, cc.replace('.',).replace("'",))
    url = "http://qgisusers.co/media/{}.pdf".format(filename)
    if not os.path.exists(qr_dir):
	    os.makedirs(qr_dir)

    filepath = os.path.join(qr_dir, "qr-{}.png".format(filename))
    qr = qrcode.QRCode(box_size=10,border=2)
    qr.add_data(url)
    qr.make(fit=True)
    img = qr.make_image()
    img.save(filepath)

    return filepath
  else:
    return NULL

1. Consola de Python y editor de scripts

2. Macros del proyecto

3. Acciones

4. Expresiones personalizadas en Python

5. Algoritmos de Geoprocesamiento

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

En C++ o en Python.

 

Usando Python tenemos 2 opciones: clases o decoradores.

 

Reciben entradas (capas, números, etc.) y retornan salidas.

 

Escribimos metadatos y QGIS crea el diálogo automáticamente.

 

Útiles para reusarlos en modelos complejos, mezclando algoritmos incluso de otros proveedores.

3ra Jornada de Talleres Internos

Algoritmos de geoprocesamiento

Recursos y documentación

3ra Jornada de Talleres Internos

Widgets

Processing agrega widgets dependiendo del tipo de entrada

que elijamos...

3ra Jornada de Talleres Internos

Nota: Los scripts con decoradores no pueden ser agregados a proveedores

          personalizados. Esto implica que no pueden instalarse desde plugins.

3ra Jornada de Talleres Internos

Scripts con decoradores

from qgis.processing import alg

@alg(name='my_script', label='Rename field from vector layer',
     group='examplescripts', group_label='Example scripts')

# 'INPUT' is the recommended name for the main input parameter
@alg.input(type=alg.VECTOR_LAYER, name='INPUT', label='Input vector layer')

# 'OUTPUT' is the recommended name for the main output parameter
@alg.output(type=alg.VECTOR_LAYER, name='OUTPUT',
            label='Vector layer with renamed field')

def my_script(instance, parameters, context, feedback, inputs):
    ...

Decoradores: "Syntactic sugar". Actúan sobre métodos y/o clases.

Escribamos un

script de geoprocesamiento

con decoradores...

3ra Jornada de Talleres Internos

Ejemplo: Renombrar un campo

 

    Entradas:

        Vector layer

        Campo a renombrar

        Nombre nuevo para el campo

    Salidas:

        Vector layer

Salidas

Opciones de salida para capas vectoriales:

 

      Cambiar la capa de entrada y retornarla modificada

 

      Ver ejemplo anterior (rename field)

 

      Crear una capa nueva y retornarla (capa original intacta)

 

      Para ello se usan los Feature Sink

3ra Jornada de Talleres Internos

Reusando scripts en modelos

3ra Jornada de Talleres Internos

1. Consola de Python y editor de scripts

2. Macros del proyecto

3. Acciones

4. Expresiones personalizadas en Python

5. Algoritmos de Geoprocesamiento

6. Plugins

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

Escribamos un ejemplo de P.O.O.

3ra Jornada de Talleres Internos

Más de PyQt5

3ra Jornada de Talleres Internos

Recursos y documentación

3ra Jornada de Talleres Internos

Principales módulos de PyQt5

Core

 

GUI

 

Widgets

3ra Jornada de Talleres Internos

qgis.PyQt.QtCore
qgis.PyQt.QtGui
qgis.PyQt.QtWidgets

Funcionalidad núcleo no gráfica.

QObject, QFile, QSettings, QRegExp, SIGNALS-SLOTS...

Funcionalidad núcleo gráfica.

QIcon, QColor, QFont, QCursor, QMouseEvent...

Controles gráficos de usuario para interfaces.

QWidget, QDialog, QPushButton, QMessageBox, QMenu...

Qt-Designer

3ra Jornada de Talleres Internos

Aplicación para

diseñar

interfaces

gráficas de Qt

 

 

Genera archivos

.ui (XML)

 

 

Permite:

   + Definir propiedades de los widgets.

   + Agrupar widgets en layouts.

   + Usar widgets propios de QGIS (custom widgets)

   + Administrar recursos (archivos externos, ej. íconos).  

Widgets de Qt

3ra Jornada de Talleres Internos

Layouts

3ra Jornada de Talleres Internos

Agrupan y organizan

widgets en una interfaz

 

 

Layouts más usados:

   Horizontal/Vertical

   Grid

   Form

 

QGIS custom widgets

3ra Jornada de Talleres Internos

SIGNALS-SLOTS

Comunicación

entre objetos de Qt.

 

Los objetos no se conocen entre sí.

(Bajo acoplamiento)

 

Los objetos emiten señales, no saben si

alguien las recibe o no. (Encapsulamiento)

3ra Jornada de Talleres Internos

SIGNALS

  Se emiten cuando ocurre un evento.

  Objetos de Qt tienen SIGNALS predefinidas.

  Podemos crear nuevas SIGNALS y emitirlas.

SLOTS

  Función llamada en respuesta a una SIGNAL.

  Objetos de Qt tienen SLOTS predefinidos.

  Podemos crear nuevos SLOTS.

SIGNALS-SLOTS

Las conexiones SIGNAL-SLOT

las hace el(la) desarrollador(a).

3ra Jornada de Talleres Internos

SIGNALS

  Pueden conectarse a cero o muchos SLOTS.

  Pueden conectarse a otras SIGNALS.

SLOTS

  Pueden conectarse a cero o muchas SIGNALS.

  Como son funciones, podemos llamarlas.

QGIS Plugins

3ra Jornada de Talleres Internos

Copialina...

3ra Jornada de Talleres Internos

Arquitectura de los plugins de QGIS

3ra Jornada de Talleres Internos

Funciones de los plugins de QGIS

3ra Jornada de Talleres Internos

__init__(iface)

 

initGUI()

 

 

unload()

 

 

run()

Crear GUI del plugin en QGIS (¿toolbar?, ¿menú?).

Definir conexiones SIGNAL-SLOT.

Remover GUI del plugin (toolbars, menús, etc.) de QGIS.

Desconectar SIGNAL-SLOTs (si es necesario).

Procesar datos o llamar diálogos del plugin.

(opcional)

Obtener acceso a objeto iface para interactuar con QGIS.

Funciones de los plugins de QGIS

3ra Jornada de Talleres Internos

__init__(iface), initGUI(), unload(), run()

¡Veámoslas en acción!

Icon adapted from https://www.iconfinder.com/paomedia

Clic a la imagen :)

Plugins para desarrolladores

3ra Jornada de Talleres Internos

Plugin reloader

First aid

Plugin builder

(Opcional)

QGIS Minimal Plugin

3ra Jornada de Talleres Internos

1. Ve a la carpeta de plugins de QGIS (ver instrucciones).

 

2. En esa carpeta crea una carpeta llamada "minimal".

 

3. Ve a https://github.com/wonder-sk/qgis-minimal-plugin

 

4. Crea los archivos __init__.py y metadata.txt copiando

    el contenido del QGIS Minimal Plugin de Martin Dobias.

 

5. Reinicia QGIS y activa el plugin "Minimal".

Plugin con Diálogo

3ra Jornada de Talleres Internos

Extendamos el Minimal Plugin...

Plugin con QGIS Custom Widgets

3ra Jornada de Talleres Internos

Extendamos el plugin con diálogo...

1. Consola de Python y editor de scripts

2. Macros del proyecto

3. Acciones

4. Expresiones personalizadas en Python

5. Algoritmos de Geoprocesamiento

6. Plugins

7. Scripts 'standalone' (sin la GUI de QGIS)

3ra Jornada de Talleres Internos

¿Dónde usar Python en QGIS?

Ahora sigues tú...

3ra Jornada de Talleres Internos

Copy of Introducción al desarrollo con PyQGIS

By Jesus Efrain Revelo Burbano

Copy of Introducción al desarrollo con PyQGIS

3ra Jornada de Talleres Internos QGIS-Co

  • 581