jueves, 16 de febrero de 2017

Utilizando gdalogr:translate en PyQGIS para convertir values a nodata

Continuando con los métodos de Processing, hoy se van a considerar los de GDAL/OGR para trabajar por vez primera en estos posts con archivos de tipo ráster. En este caso, se va a probar el método 'gdalogr:translate' para transformar en 'no data' los values iguales a cero en un ráster de 20 x 20 con values aleatorios entre 0 y 10. El plugin de 'Processing Information' (ver imagen siguiente) permite corroborar la presencia de 44 geoalgoritmos en este renglon; entre los cuales se encuentra el de nuestro interés: 'gdalogr:translate' (número 42).




En este caso, la ayuda del comando es bastante extensa y se despliega, por separado, en las dos imágenes siguientes.



Se observa que el comando 'gdalogr:translate' permite hasta 18 parámetros, por lo cual en el código siguiente se comentó cada uno de ellos para entender mejor la sistematización del mismo. Otro aspecto importante a señalar es que los data tipos de GDAL/OGR no coinciden con los de PyQGIS y de allí los dos diccionarios, QGIS_TYPE y RTYPE, para realizar la equivalencia y pasarle este último al comando de la manera correcta.

 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
30
31
32
33
34
35
36
37
38
39
40
import processing

layer = iface.activeLayer()

extent = layer.extent()

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

path = '/home/zeito/pyqgis_data/new_raster.tif'

type = layer.type()
provider = layer.dataProvider()

dataType = provider.dataType(type)

QGIS_TYPE = {QGis.Byte:'Byte', QGis.UInt16:'UInt16', QGis.Int16:'Int16', QGis.UInt32:'UInt32', QGis.Int32:'Int32', QGis.Float32:'Float32', QGis.Float64:'Float64'}

new_type = QGIS_TYPE[dataType]

RTYPE = { 'Byte': 0, 'Int16': 1, 'UInt16': 2, 'UInt32':3, 'Int32':4, 'Float32':5, 'Float64':6 }

processing.runalg('gdalogr:translate', 
                  layer, #INPUT <ParameterRaster>
                  100.0, #OUTSIZE <ParameterNumber>
                  True,  #OUTSIZE_PERC <ParameterBoolean>
                  '0',   #NO_DATA <ParameterString>
                  0,     #EXPAND <ParameterSelection> ---> 0 - none
                  '',    #SRS <ParameterCrs>
                  "%f,%f,%f,%f" % (xmin, xmax, ymin, ymax), #PROJWIN <ParameterExtent>
                  False, #SDS <ParameterBoolean>
                  RTYPE[new_type],     #RTYPE <ParameterSelection> ---> 5 - Float32
                  4,     #COMPRESS <ParameterSelection> ---> 4 - DEFLATE
                  75.0,  #JPEGCOMPRESSION <ParameterNumber>
                  6.0,   #ZLEVEL <ParameterNumber>
                  1.0,   #PREDICTOR <ParameterNumber>
                  False, #TILED <ParameterBoolean>
                  0,     #BIGTIFF <ParameterSelection> ---> 0-
                  False, #TFW <ParameterBoolean>
                  None,  #EXTRA <ParameterString>
                  path)  #OUTPUT <OutputRaster>

La ejecución del código anterior en la Python Console de QGIS produce un ráster que cumple con lo esperado. En la imagen siguiente se observa la corroboración mediante el uso del plugin Value Tool:


No hay comentarios: