Usar las capas ráster¶
Advertencia
Los extractos de códigos en esta página, requieren las siguientes importaciones, si es que estás trabajando fuera de la consola pyqgis:
from qgis.core import (
QgsRasterLayer,
QgsColorRampShader,
QgsSingleBandPseudoColorRenderer
)
Detalles de la capa¶
Una capa ráster está compuesta por una o más bandas ráster — denominadas como raster de banda única o multibanda. Una banda representa una matriz de valores. Una imagen a color (p. ej. una fotografía aérea) es un ráster que está constituido por bandas roja, azul y verde. Los rásteres de banda única, representan generalmente variables continuas (p. ej. elevación) o variables discretas (p. ej. uso del suelo). En algunos casos, una capa ráster viene con una paleta y los valores ráster se refieren a los colores almacenados en la paleta.
El código a continuación, asume que rlayer
es un objeto de QgsRasterLayer
.
rlayer = QgsProject.instance().mapLayersByName('srtm')[0]
# get the resolution of the raster in layer unit
rlayer.width(), rlayer.height()
(919, 619)
# get the extent of the layer as QgsRectangle
rlayer.extent()
<QgsRectangle: 20.06856808199999875 -34.27001076999999896, 20.83945284300000012 -33.75077500700000144>
# get the extent of the layer as Strings
rlayer.extent().toString()
'20.0685680819999988,-34.2700107699999990 : 20.8394528430000001,-33.7507750070000014'
# get the raster type: 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband
rlayer.rasterType()
0
# get the total band count of the raster
rlayer.bandCount()
1
# get all the available metadata as a QgsLayerMetadata object
rlayer.metadata()
'<qgis._core.QgsLayerMetadata object at 0x13711d558>'
Renderizador¶
Cuando una capa ráster es cargada, recibe en base a su tipo, el valor del renderizador de forma predeterminada. Esto puede ser modificado tanto en las propiedades de capa o mediante programación.
Para consultar el actual renderizador:
rlayer.renderer()
<qgis._core.QgsSingleBandGrayRenderer object at 0x7f471c1da8a0>
rlayer.renderer().type()
'singlebandgray'
Para configurar un renderizador, use el método setRenderer
de la clase QgsRasterLayer
. Hay varias clases de renderizador (derivadas de QgsRasterRenderer
):
Las capas ráster de banda única pueden ser dibujadas tanto en colores grises (valor menor = negro, valor alto = blanco) o con un algoritmo pseudocolor que asigna colores a los valores. Rásters de banda única con una paleta puedes ser dibujados usando la paleta. Las capas multibanda generalmente se dibujan asignando las bandas a colores RGB. Otra posibilidad es usar una sola banda para dibujar.
Rásters de una sola banda¶
Supongamos que queremos renderizar una capa ráster de una sola banda con colores que van del verde al amarillo (correspondiente a los valores de píxel de 0 a 255). En la primera etapa prepararemos un objeto QgsRasterShader
y configuraremos su función shader:
fcn = QgsColorRampShader()
fcn.setColorRampType(QgsColorRampShader.Interpolated)
lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)),
QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
fcn.setColorRampItemList(lst)
shader = QgsRasterShader()
shader.setRasterShaderFunction(fcn)
El sombreador asigna los colores según lo especificado por su mapa de colores. El mapa de colores es proveído como una lista de valores de pixeles con colores asociados. Hay tres modos de interpolación:
lineal (
Interpolated
): el color es linealmente interpolado desde las entradas en el mapa de colores, que están por encima y por debajo de el valor de pixel.discreto (
Discrete
): el color es tomado desde la entrada más cercana con igual o mayor valor en el mapa de colores.exacto (
Exact
): el color no es interpolado, solo los pixeles con un valor igual a las entradas del mapa de colores serán dibujados.
En el segundo paso asociaremos el sombreador con una capa ráster:
renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader)
rlayer.setRenderer(renderer)
El número 1
en el código anterior es el número de la banda (bandas ráster son indexadas de uno).
Finalmente debemos utilizar el método triggerRepaint
para ver los resultados:
rlayer.triggerRepaint()
Rásters multibanda¶
De forma predeterminada, QGIS asigna las tres primeras bandas a rojo, verde y azul para crear una imagen de color (este es el estilo de dibujo “”MultiBandColor””). En algunos casos, es posible que desee omitir esta configuración. El código siguiente intercambia la banda roja (1) y la banda verde (2):
rlayer_multi = QgsProject.instance().mapLayersByName('multiband')[0]
rlayer_multi.renderer().setGreenBand(1)
rlayer_multi.renderer().setRedBand(2)
En caso de que sea necesaria solo una banda para la visualización del ráster, se puede elegir el dibujo de una banda única, ya sea niveles grises o pseudocolor.
Se tiene que usar triggerRepaint
para actualizar el mapa y ver el resultado:
rlayer_multi.triggerRepaint()
Valores de consulta¶
Los valores ráster se pueden consultar mediante el método sample
de la clase QgsRasterDataProvider
. Debe especificar un QgsPointXY
y el número de banda de la capa ráster que desea consultar. El método devuelve una tupla con el valor y “”True”” o “”False”” dependiendo de los resultados:
val, res = rlayer.dataProvider().sample(QgsPointXY(20.50, -34), 1)
Otra forma de consultar los valores ráster es usando el método identify
, que retorna un objeto QgsRasterIdentifyResult
.
ident = rlayer.dataProvider().identify(QgsPointXY(20.5, -34), QgsRaster.IdentifyFormatValue)
if ident.isValid():
print(ident.results())
En este caso, el método results
retorna un diccionario, que tiene el índice de la banda como clave y los valores de la banda como valor. Por ejemplo, algo como {1: 323.0}
.