Jesus Efrain Revelo Burbano
Ingeniero de Sistemas, me dedico a implementar y optimizar procesos mediante el uso de sistemas de información geográficas
Germán Carrillo
2020
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...)
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
3ra Jornada de Talleres Internos
Así como en la cocina, en programación se cometen errores...
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...
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
¡Escribamos algo de Python!
3ra Jornada de Talleres Internos
Intérprete de Python
Tipos de datos
Condicionales y ciclos
Funciones
3ra Jornada de Talleres Internos
3ra Jornada de Talleres Internos
QGIS API (C++):
QGIS API (Python):
PyQGIS Cookbook:
https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/
3ra Jornada de Talleres Internos
1. Consola de Python y editor de scripts
Ctrl
+
Alt
+
P
3ra Jornada de Talleres Internos
2. Macros del proyecto
Proyecto --> Propiedades...
3ra Jornada de Talleres Internos
3. Acciones
Propiedades de la capa --> Acciones
3ra Jornada de Talleres Internos
4. Expresiones personalizadas en Python
Diálogo de expresiones --> Editor de Funciones
3ra Jornada de Talleres Internos
5. Algoritmos de Geoprocesamiento
Ventana de Procesamiento --> Scripts
3ra Jornada de Talleres Internos
6. Plugins
3ra Jornada de Talleres Internos
7. Scripts 'standalone' (sin la GUI de QGIS)
3ra Jornada de Talleres Internos
1. Consola de Python y editor de scripts
3ra Jornada de Talleres Internos
¡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
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
"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
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
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
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
Cuando abrimos QGIS, podemos acceder a sus objetos
3ra Jornada de Talleres Internos
QgisInterface
iface
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
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
3ra Jornada de Talleres Internos
openProject() saveProject() closeProject()
3ra Jornada de Talleres Internos
Cuando se abra este proyecto... abrir la consola de Python!
Fuente: https://gis.stackexchange.com/a/132714/4972
3ra Jornada de Talleres Internos
¿Otros casos de uso?
openProject() saveProject() closeProject()
¿Y si quiero una acción para todos mis proyectos?
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\
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
1. Consola de Python y editor de scripts
2. Macros del proyecto
3. Acciones
3ra Jornada de Talleres Internos
3ra Jornada de Talleres Internos
Capa
Feature (objeto)
Lienzo (mapa)
Campo
3ra Jornada de Talleres Internos
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
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
Editor de funciones
3ra Jornada de Talleres Internos
Diálogo de expresiones --> Editor de Funciones
Ejemplo: Dado un punto, obtener su valor de altura desde DEM
3ra Jornada de Talleres Internos
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
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
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
QGIS docs:
https://docs.qgis.org/testing/en/docs/user_manual/processing/scripts.html
Definiendo parámetros de entrada:
https://api.qgis.org/master/classQgsProcessingParameterDefinition.html
Definiedo parámetros de salida:
https://api.qgis.org/master/classQgsProcessingOutputDefinition.html
Leyendo parámetros:
https://api.qgis.org/master/classQgsProcessingAlgorithm.html
¡Otros scripts!
3ra Jornada de Talleres Internos
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
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.
3ra Jornada de Talleres Internos
Ejemplo: Renombrar un campo
Entradas:
Vector layer
Campo a renombrar
Nombre nuevo para el campo
Salidas:
Vector layer
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
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
3ra Jornada de Talleres Internos
3ra Jornada de Talleres Internos
Qt5 (C++):
PyQt5:
https://www.riverbankcomputing.com/static/Docs/PyQt5/module_index.html
PyQt5 examples:
https://github.com/pyqt/examples
3ra Jornada de Talleres Internos
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...
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).
3ra Jornada de Talleres Internos
3ra Jornada de Talleres Internos
Agrupan y organizan
widgets en una interfaz
Layouts más usados:
Horizontal/Vertical
Grid
Form
3ra Jornada de Talleres Internos
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.
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.
Más info en: https://doc.qt.io/qt-5/signalsandslots.html
3ra Jornada de Talleres Internos
3ra Jornada de Talleres Internos
3ra Jornada de Talleres Internos
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.
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 :)
3ra Jornada de Talleres Internos
Plugin reloader
First aid
Plugin builder
(Opcional)
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".
3ra Jornada de Talleres Internos
Extendamos el Minimal Plugin...
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
3ra Jornada de Talleres Internos
By Jesus Efrain Revelo Burbano
3ra Jornada de Talleres Internos QGIS-Co
Ingeniero de Sistemas, me dedico a implementar y optimizar procesos mediante el uso de sistemas de información geográficas