lunes, 2 de septiembre de 2019

Objetos QgsRasterHistogramWidget para obtener histogramas de capas ráster con PyQGIS 3

En la imagen siguiente se observa la generación de los histogramas de un ráster con 4 bandas (las tres RGB más el canal alfa) donde prácticamente no tienen utilidad porque las opciones por defecto, expresadas en el menú de preferencias, cargan simultáneamente todas las bandas y la alfa, con un sólo valor y una frecuencia muy alta, impide la visualización adecuada de las RGB.


Para obtener un resultado útil, por ejemplo para la banda 1 (rojo), se tiene que hacer la selección manual en el menú de preferencias. El resultado se indica en la imagen a continuación:


Un resultado similar se puede obtener mediante programación con PyQGIS 3 empleando los objetos de tipo QgsRasterHistogramWidget. Sólo hay que identificar cuáles son las acciones asociadas a las opciones del menú correspondiente para desmarcarlas o hacerlas activas. La búsqueda dió como resultado que el referido menú correspondió al children[5]. Por tanto, se generó el código siguiente:

 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
layer = iface.activeLayer()

w = QgsRasterHistogramWidget(layer)
w.setWindowTitle('Layer Properties-' + layer.name() + '|Histogram')
band = 1
w.setSelectedBand(band)  #default band 1
w.setFixedWidth(600)
w.computeHistogram(True)
w.refreshHistogram()
w.show()

children = w.children()

children[1].setFixedWidth(575) #'mpPlot'

pref = children[5]  # QMenu of preferences

pref_actions = pref.actions()

option = 0

name_actions = [ action.text() for action in pref_actions ]

print(name_actions)

for action in pref_actions:
    if action.text() == 'Draw as lines':
        action.setChecked(option)
        action.trigger()    
     
    if action.text() == 'Show selected band':
        action.trigger()

La ejecución del código anterior en la Python Console de PyQGIS produce el resultado siguiente:


Si se cambia el valor de opcion de 0 a 1 el diagrama obtenido será del tipo barras.


No hay comentarios: