PYQGIS
Madrid 2017
Francisco Raga López
¿¿Quién es este tipo??
Francisco Raga López
Ingeniero en Cartografía y Geodesia
Full-Stack GIS Developer
¿Qué es PyQGIS?
PyQGIS es la librería de QGIS para ejecutar código en Python.
Estuvo disponible desde la Versión 0.9 'Ganymede' en 2007 ,Enlace
La elección de Python no es trivial ya que es el lenguaje más utilizado, para realizar scripting .
QGIS API Documentation :
¿Qué podemos hacer con PyQGIS?
-
Automatizar tareas en nuestro trabajo,creando workflows y optimizando la producción en nuestro día a día. Añadir,borrar,actualizar elementos,cambio entre proyecto más rápidamente,geoprocesos encadenados de manera más eficiente etc.
Python y QGIS para visualizaciones geoespaciales - caso de estudio
-
Crear aplicaciones independientes,standalone.
Visor de Shapefiles con QGIS, Python y Qt
Creating a Standalone GIS Application
- Crear complementos "plugins" para QGIS.
Recursos Disponibles
QGIS API Documentation :
Listas de correo
Maneras de Ejecutar Python en QGIS
7 Maneras de ejecutar Python en QGIS
- Consola de Python en QGIS
- Plugin ScriptRunner
- Eventos del Proyecto
- Processing Framework
- Funciones init Python
- Expresiones
- Acciones QGIS
Ejemplo básico PyQt
2. Ejecutamos el ejemplo HolaPyQt.py :
- Configurar variables de entorno windows para Python :
setx OSGEO4W_ROOT "D:\OSGeo4W64"
setx GDAL_DATA "%OSGEO4W_ROOT%\share\gdal"
setx GDAL_DRIVER_PATH "%OSGEO4W_ROOT%\bin\gdalplugins"
setx PATH "%OSGEO4W_ROOT%\bin;%OSGEO4W_ROOT%\apps\qgis\bin;%PATH%"
setx PYTHONHOME "%OSGEO4W_ROOT%\apps\Python27"
setx PYTHONPATH "%OSGEO4W_ROOT%\apps\qgis\python"
setx QGIS_PREFIX_PATH "%OSGEO4W_ROOT%\apps\qgis\"
python HolaPyQt.py
Comprobamos
C:\Windows\System32>python
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Hola PyQt
PyQGIS por consola
Consola de Python
En este punto ejecutaremos comandos básicos por consola.
Abrimos el proyecto "project.qgs" que encontraremos en la documentación del taller y el documento Comandos _Basicos.py
Consola de Python (Gdal)
Geospatial Data Abstraction Library o GDAL es una biblioteca de software para la lectura y escritura de formatos de datos geoespaciales.
Fichero nearblack_rasters.py
import glob,os
import subprocess
Carpeta = "D:\GeoInquietos\datos\datos_ejercicios\gdal"
Salida = "D:\GeoInquietos\datos\datos_ejercicios\gdal\output"
rasters = glob.glob(Carpeta + "\\" + "*.jp2")
for raster in rasters:
print "Procesando : " + raster
nearblack = Salida + "\\" + os.path.basename(raster)
subprocess.call('nearblack %s -o %s' % (raster, nearblack))
Script Runner
Script Runner
Este plugin nos permite ejecutar código independientemente de donde este ubicado nuestro script,automatizar tareas y no es necesario establecer las variables de entorno de Python.
Pasos :
- Instalamos el plugin desde el gestor de complementos.
- Abrimos el plugin
- Cargamos los ejemplos create_polygon_SR.py y create_polygon_SR_args.py
Creamos nuestro Plugin
Herramientas Necesarias
Qt Designer: QGIS se escribe utilizando el marco de Qt. Para el desarrollo de plugins, usaremos una aplicación llamada Qt Designer para diseñar la interfaz para nuestro plugin.Se encuentra dentro del paquete de OSGeo4W.
Python Bindings para Qt : Para crear plugins necesitamos la herramienta de comandos pyrcc4.Para eso necesitamos descargar el paquete de OSGeo4W.
Herramientas Necesarias
- Un editor de texto o un Python IDE: Aquí podemos elegir programas como Notepad ++, aunque yo recomiendo emplear eclipse con el plugin PyDev.
- Plugin Builder: Con este plugin podemos crear toda la estructura necesaria de nuestro desarrollo.
https://plugins.qgis.org/plugins/pluginbuilder/
- Plugin Reloader:Necesaria para recargar nuestro plugin sin necesidad de cerrar y abrir Qgis.
Resumen pasos necesarios:
- Creamos la estructura
- Compilamos
- Creamos el Interfaz
- Código
- Resultado
1. Creamos la estructura
1
2
1. Creamos la estructura
3
Rutas
Windows
Mac
Linux
c:\Users\username\.qgis2\python\plugins
/Users/username/.qgis2/python/plugins
/home/username/.qgis2/python/plugins
1. Creamos la estructura
4
D:\GeoInquietos\Taller_PyQgis\Python\ejercicios\Plugin\Zoomer
2. Compilamos
Necesitamos compilar el fichero de recursos resources.qrc
- Abrimos la consola de OSGeo4W
- Buscamos el directorio del plugin :
- Escribimos:
C:\Users\<username>\.qgis2\python\plugins\GetLayers
make
3. Creamos el Interfaz
Abrimos Qt Designer y dejamos Qgis abierto
- Label
- boton
- Combobox
- Layout
Seleccionamos el plugin en la configuración de Plugin Reloader
4. Código
Abrimos el fichero Get_Zoom.py y modificamos el método run()
def run(self):
if not self.pluginIsActive:
self.pluginIsActive = True
#Log
log = lambda m: QgsMessageLog.logMessage(m,'Zoomer')
log('Start Zoomer')
if self.dockwidget == None:
# Create the dockwidget (after translation) and keep reference
self.dockwidget = ZoomerDockWidget()
self.iface.messageBar().pushMessage("Plugin Zoomer",'Mostramos el widget ' , QgsMessageBar.INFO,3)
self.iface.addDockWidget(Qt.BottomDockWidgetArea, self.dockwidget)
self.dockwidget.show()
#Populate Combobox
log('Populate Combobox')
layers = self.iface.legendInterface().layers()
layer_list = []
layer_list = [layer.name() for layer in layers]
self.dockwidget.comboBox.clear()
self.dockwidget.comboBox.addItems(layer_list)
def ZoomLayer():
# Identify selected layer by its index
selectedLayerIndex = self.dockwidget.comboBox.currentIndex()
selectedLayer = layers[selectedLayerIndex]
self.iface.mapCanvas().setExtent(selectedLayer.extent())
self.iface.mapCanvas().refresh()
#Button Signal
self.dockwidget.pushButton.clicked.connect(ZoomLayer)
#Combo Signal
self.dockwidget.comboBox.currentIndexChanged.connect(ZoomLayer)
#Connect to provide cleanup on closing of dockwidget
self.dockwidget.closingPlugin.connect(self.onClosePlugin)
5.Resultado
Preguntas?
Francisco Raga López
franka1986@gmail.com
"Emplear software libre es más divertido si participamos en él !! "
Gracias por su atención
Programación GIS III
By Fran Raga
Programación GIS III
Presentación curso Programación GIS III,Geoinquietos Madrid
- 317