sábado, 31 de agosto de 2019

Additional No Data Values en capas Raster con PyQGIS 3

Los No Data Values en las capas ráster se adicionan a través de los métodos de la clase QgsRasterDataProvider. Cuando se emplea sólo el método 'setNoDataValue', aunque la visualización en el Map Canvas es la correcta, no se agrega a la Map Legend y por tanto no se inicializa adecuadamente el histograma del ráster.

Para comprender como funciona el proceso de asignación vamos a usar un ráster de prueba de 5x5 con valores aleatorios entre 0-10; tal como se presenta en la imagen siguiente. Observe que todavía no tiene asignados los No Data Values.


Cuando se ejecuta la porción siguiente de código en la Python Console de QGIS:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
layer = iface.activeLayer()

provider = layer.dataProvider()

provider.initHistogram(QgsRasterHistogram(), 0, 10)

histogram = provider.histogram(1)

print(histogram.minimum, histogram.maximum)
print(histogram.histogramVector)

se obtiene como resultado:

0.0 10.0
[2, 2, 4, 3, 3, 1, 1, 2, 5, 1, 1]

El mínimo es 0 y el máximo 10 de los 11 valores posible. Además, se tiene en la lista de valores que hay dos 0 values, dos 1 values, cuatro 2 values y así sucesivamente. Para adicionar adecuadamente los No Data Values (cero en este caso) se emplean simultáneamente los métodos 'setNoDataValue' y 'setUserNoDataValue'. Este último emplea como segundo argumento un objecto iterable (lista) del tipo QgsRasterRange. Esto permite iniciar adecuadamente el histograma excluyendo los ceros como No Data Value; tal como se observará en el valor mínimo y en la lista de valores correspondiente. Se incluye en el código a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
layer = iface.activeLayer()
provider = layer.dataProvider()
layer.triggerRepaint()

provider.setNoDataValue(1, 0) #first one is referred to band number 
provider.setUserNoDataValue(1, [QgsRasterRange(0,0)]) #Additional No Data Value Raster

provider.initHistogram(QgsRasterHistogram(), 1, 10)

histogram = provider.histogram(1)

print(histogram.minimum, histogram.maximum)
print(histogram.histogramVector)

La ejecución del código anterior permite obtener el resultado siguiente. Observe que el mínimo ahora es 1 y el cero se excluyó de la lista de valores (ahora sólo hay 10 posibles).

1.0 10.0
[2, 4, 3, 3, 1, 1, 2, 5, 1, 1]

El resultado también se visualiza en la imagen siguiente. La tabla de propiedades refleja los No Data Values y los Additional No Data Value. El Map Canvas permite también observar en marrón los No Data Values porque como se usó una capa subyacente como contraste de fondo éstos aparecen como 100 % transparentes.


No hay comentarios: