domingo, 26 de noviembre de 2017

Usando algunas funcionalidades de PyQGIS en QGIS 3 (2.99) para Windows

Como es del conocimiento general y si se cumple la hoja de ruta, el próximo 18 de diciembre será el lanzamiento de QGIS 3.0.0. Para adelantarme a este acontecimiento y saber a que atenerme en el futuro con relación a PyQGIS, bajé e instalé la versión actual de QGIS 2.99 para Windows.

Ya había leido al respecto de que los cambios son numerosos y el reto es ahora afrontarlos. Con relación a la transición de Python 2.7.x a Python 3.0.x algunas cosas he hecho en este Blog y probablemente allí no radicará la dificultad.

El problema se va a presentar cuando tenga que usar las clases de PyQGIS y las de PyQt5 para producir plugins. En mi primer contacto con esta versión de QGIS ya me tocó Googlear para establecer los locale en inglés porque ahora se configuran en Settings -> Options -> General (se eliminó la opción individual de Locale). Otra cosa que he podido observar es que hasta el momento no hay QtDesigner para Qt5 ni Consola de OSGeo en la oferta de aplicaciones disponibles (sólo Grass 7.2.2). En Linux creo recordar que ya tengo una versión de QtDesigner para Qt5 pero no estoy seguro. No obstante, sería bastante tedioso hacer las ediciones de los objetos Qt5 allí para luego exportarlas a Windows.

Por otra parte, la primera ejecución de un código con muy pocas líneas de PyQGIS con Processing (Grass 7) arrojó múltiples errores. Mi plugin de Processing para averiguar los parámetros de Grass 7 no ayuda porque estos también cambiaron en QGIS 3. Tocará, mientras tanto, apelar a la vieja función de getPat2 para explorar los métodos de PyQGIS y al nuevo método 'algorithmHelp' de Processing para corroborar los parámetros (con él verifiqué que para 'grass7:r.surf.gauss' son diferentes a pesar de llamarse igual en QGIS 2.18.x y QGIS 2.99).

Después de algún tiempo explorando, pude ejecutar el código siguiente que fue tomado y adaptado parcialmente de un manual de PyQGIS para la versión 2.x. Ya no existe el método 'getObjectFromUri' ni 'runalg' (cambiado a 'run') de processing y fue eliminada la clase QgsMapLayerRegistry. Las funcionalidades de esta última se recogieron en QgsProject. Por otra parte, la mejor manera de pasarle parámetros a las tool de processing es mediante un diccionario ya que no importa el orden y tampoco se requieren todos (sólo el número mínimo de ellos). Además, por lo que pude explorar, ya no acepta archivos temporales para las capas (no pude hacerlas funcionar con None para el output; antiguo default para capas temporales). Por ahora, la ayuda que suministra 'algorithmHelp' es todavía un poco confusa y tendré que acustumbrarme a su nomenclatura.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import processing

uri = 'c:/Users/usuario/pyqgis_data/utah_demUTM2.tif'

layer = QgsRasterLayer(uri,
                       "raster")

QgsProject.instance().addMapLayer(layer)

extent = layer.extent()

xmin, ymin, xmax, ymax = extent.toRectF().getCoords()

extent = str(xmin)+ ',' + str(xmax)+ ',' +str(ymin)+ ',' +str(ymax) 

print (extent)

dict = {'GRASS_REGION_PARAMETER': extent, 
        'output':'c:/Users/usuario/pyqgis_data/gaussian_deviates.tif',
        'GRASS_REGION_CELLSIZE_PARAMETER':0}

gauss_1 = processing.run('grass7:r.surf.gauss', 
                         dict)

gauss_1 = QgsRasterLayer(gauss_1['output'],
                        'gauss_1')

QgsProject.instance().addMapLayer(gauss_1)

Después de ejecutado el código anterior en la Python Console de QGIS 3 obtuve las capas rásteres siguientes, que individualizo en dos imágenes, a pesar de haberse obtenido simultáneamente. La primera de ellas fue:


y la otra, correspondiente al resultado de la herramienta, la siguiente:


No hay comentarios: