6 votos

¿Cómo actualizar la rampa de color raster con nuevos valores mín./máx. utilizando PyQGIS?

Estoy intentando actualizar un renderizador de pseudo color de una sola banda con nuevos valores min/max desde la consola de python. Todos los ejemplos de código que he podido encontrar tratan de la construcción de un renderizador desde cero, pero en este caso tengo una configuración de rampa de color para una capa existente y quiero ser capaz de estirar a la rampa de color con nuevos valores min / max.

Puedo establecer los nuevos valores mín/máx para el renderizador, sólo que no he descubierto cómo reclasificar la rampa de color (estoy buscando el equivalente a pulsar el botón "clasificar" en el diálogo de propiedades de estilo).

Esto es lo que tengo hasta ahora:

l = iface.activeLayer()

provider = l.dataProvider()
extent = canvas.extent()
stats = provider.bandStatistics(1, QgsRasterBandStats.All, extent)

min = stats.minimumValue
max = stats.maximumValue

l.renderer().setClassificationMin(min)
l.renderer().setClassificationMax(max)

4voto

Yada Puntos 9489

Con el siguiente código puedes obtener un color de rampa rojo-amarillo-azul . En mín/máx para el renderizador se obtienen de raster stats.

from PyQt4.QtCore import *
from PyQt4.QtGui import *

layer = iface.activeLayer()

renderer = layer.renderer()
provider = layer.dataProvider()
extent = layer.extent()

ver = provider.hasStatistics(1, QgsRasterBandStats.All)

stats = provider.bandStatistics(1, QgsRasterBandStats.All,extent, 0)

if ver is not False:
    print "minimumValue = ", stats.minimumValue

    print "maximumValue = ", stats.maximumValue

if (stats.minimumValue < 0):
    min = 0  

else: 
    min= stats.minimumValue

max = stats.maximumValue
range = max - min
add = range//2
interval = min + add

colDic = {'red':'#ff0000', 'yellow':'#ffff00','blue':'#0000ff'}

valueList =[min, interval, max]

lst = [ QgsColorRampShader.ColorRampItem(valueList[0], QColor(colDic['red'])), 
        QgsColorRampShader.ColorRampItem(valueList[1], QColor(colDic['yellow'])), 
        QgsColorRampShader.ColorRampItem(valueList[2], QColor(colDic['blue']))]

myRasterShader = QgsRasterShader()
myColorRamp = QgsColorRampShader()

myColorRamp.setColorRampItemList(lst)
myColorRamp.setColorRampType(QgsColorRampShader.INTERPOLATED)
myRasterShader.setRasterShaderFunction(myColorRamp)

myPseudoRenderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), 
                                                    layer.type(),  
                                                    myRasterShader)

layer.setRenderer(myPseudoRenderer)

layer.triggerRepaint()

Antes de ejecutar el código (la trama en el lienzo de mapa debe ser la capa activa):

enter image description here

Después de ejecutar el código en la consola Python de QGIS:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X