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.

 

All Plugins

 

Recursos Disponibles

 

Libros PyQGIS :

 

Plugins : QGIS lessons  ,Documentación Plugin

 

 

             

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  :

  1. 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 :

 

  1. Instalamos el plugin desde el gestor de complementos.
  2. Abrimos el plugin  
  3. 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.

Instalador OSGeo4W  ( 32 bit o 64 bit )

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.

https://plugins.qgis.org/plugins/plugin_reloader/

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 :
    1.  
    2. 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

  • 324