Madrid 2017
Francisco Raga López
Francisco Raga López
Ingeniero en Cartografía y Geodesia
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 :
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
QGIS API Documentation :
Listas de correo
7 Maneras de ejecutar Python en QGIS
2. Ejecutamos el ejemplo HolaPyQt.py :
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
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
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 :
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.
https://plugins.qgis.org/plugins/pluginbuilder/
Resumen pasos necesarios:
1
2
3
Rutas
Windows
Mac
Linux
c:\Users\username\.qgis2\python\plugins
/Users/username/.qgis2/python/plugins
/home/username/.qgis2/python/plugins
4
D:\GeoInquietos\Taller_PyQgis\Python\ejercicios\Plugin\Zoomer
Necesitamos compilar el fichero de recursos resources.qrc
C:\Users\<username>\.qgis2\python\plugins\GetLayers
make
Abrimos Qt Designer y dejamos Qgis abierto
Seleccionamos el plugin en la configuración de Plugin Reloader
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)
Francisco Raga López
franka1986@gmail.com
"Emplear software libre es más divertido si participamos en él !! "
Gracias por su atención