martes, 28 de febrero de 2017

Usando Processing qgis:creategrid con PyQGIS

En este post se van a probar diferentes opciones correspondientes a la creacción de retículas mediante el método 'creategrid' de QGIS Processing. Para ello se va usar como base para la obtención de la extensión un ráster que no necesita estar cargado en la Map View de QGIS porque la referencia al objeto se obtiene a partir de una URI (uniform resource identifier) mediante el método 'getObjectFromUri' de processing.



Los parámetros a usar se tienen a continuación:


Por tanto, el código desarrollado es el siguiente (para una grid de 5000 m x 5000 m):

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
29
import processing

uri = '/home/zeito/pyqgis_data/utah_demUTM2.tif'

layer = processing.getObjectFromUri(uri)

extent = layer.extent()

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

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

TYPE = 0
HSPACING = 5000
VSPACING = 5000

path = processing.runalg('qgis:creategrid', 
                         TYPE, 
                         extent, 
                         HSPACING,
                         VSPACING,
                         layer.crs().authid(), 
                         None)

grid = QgsVectorLayer(path['OUTPUT'],
                      'grid',
                      'ogr')

QgsMapLayerRegistry.instance().addMapLayer(grid)

Cuando TYPE es cero (Rectangle; line) se tiene:


donde se observa que no es necesario tener el ráster cargado para visualizar la grid.

Cuando TYPE es uno (Rectangle; polygon) se obtiene lo siguiente:


Se observa que la grid se genera desde (xmin, ymin) hasta (xmax, ymax) empleando el ráster como referencia. Si seleccionan secuencialmente los rasgos verán que estos se despliegan de abajo hacia arriba desde la izquierda, es decir, en sentido vertical (no horizontal, de izquierda a derecha, y desde la parte superior como se espera).

Al seleccionar TYPE igual a dos (Diamond; polygon) se tiene:


En este caso observamos que la cobertura es incompleta. Se han seleccionado los tres primeros features para visualizar lo comentado anteriormente.

Finalmente, con TYPE igual a tres (Hexagon; polygon) también se observa que la cobertura es incompleta.


En los casos de cobertura incompleta esto puede resolverse modificando los valores de (xmin, ymin) y (xmax, ymax) restando y añadiendo los valores de HSPACING y VSPACING, según convenga, hasta obtener solapamiento. Después, se puede usar la extensión del ráster para, mediante un clip, eliminar los "trozos" sobrantes.

No hay comentarios: