Usar las capas ráster

Esta sección enumera varias operaciones que se pueden hacer con capas ráster.

Detalles de la capa

La capa ráster se compone de una o más bandas ráster — que se conoce, ya sea como una sola banda o multibanda ráster. Una banda representa una matriz de valores. La imagen en color habitual (por ejemplo, foto aérea) es un ráster que consiste en banda roja, azul y verde. Las capas de una sola banda suelen representar bien las variables continuas (por ejemplo, elevación) o variables discretas (por ejemplo, uso de la tierra). En algunos casos, una capa ráster viene con una paleta y valores ráster se refieren a los colores almacenados en la paleta:

rlayer.width(), rlayer.height()
(812, 301)
rlayer.extent()
<qgis._core.QgsRectangle object at 0x000000000F8A2048>
rlayer.extent().toString()
u'12.095833,48.552777 : 18.863888,51.056944'
rlayer.rasterType()
2  # 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband
rlayer.bandCount()
3
rlayer.metadata()
u'<p class="glossy">Driver:</p>...'
rlayer.hasPyramids()
False

Drawing Style

When a raster layer is loaded, it gets a default drawing style based on its type. It can be altered either in raster layer properties or programmatically. The following drawing styles exist:

Index Constant: QgsRasterLater.X Comment
1 SingleBandGray Single band image drawn as a range of gray colors
2 SingleBandPseudoColor Single band image drawn using a pseudocolor algorithm
3 PalettedColor “Palette” image drawn using color table
4 PalettedSingleBandGray “Palette” layer drawn in gray scale
5 PalettedSingleBandPseudoColor “Palette” layer drawn using a pseudocolor algorithm
7 MultiBandSingleBandGray Layer containing 2 or more bands, but a single band drawn as a range of gray colors
8 MultiBandSingleBandPseudoColor Layer containing 2 or more bands, but a single band drawn using a pseudocolor algorithm
9 MultiBandColor Layer containing 2 or more bands, mapped to RGB color space.

To query the current drawing style:

rlayer.renderer().type()
u'singlebandpseudocolor'

Las capas ráster de una sola banda se puede dibujar ya sea en colores grises (valores bajos = negro, valores altos = blanco) o con un algoritmo de pseudocolor que asigna colores para los valores de una sola banda. Los ráster de una sola banda con una paleta además se pueden dibujar al utilizar su paleta. Capas multibanda suelen dibujarse mediante la asignación de las bandas de colores RGB. Otra posibilidad es utilizar una sola banda para el dibujo gris o pseudocolor.

Las siguientes secciones explican cómo consultar y modificar el estilo de dibujo de la capa. Después de hacer los cambios, es posible que desee forzar la actualización del lienzo del mapa, ver ref:refresh-layer.

TODO:

mejoras de contraste, la transparencia (sin datos), máximos /mínimos definidos por el usuario, estadísticas de la banda

Rásters de una sola banda

They are rendered in gray colors by default. To change the drawing style to pseudocolor:

# Check the renderer
rlayer.renderer().type()
u'singlebandgray'
rlayer.setDrawingStyle("SingleBandPseudoColor")
# The renderer is now changed
rlayer.renderer().type()
u'singlebandpseudocolor'
# Set a color ramp hader function
shader_func = QgsColorRampShader()
rlayer.renderer().shader().setRasterShaderFunction(shader_func)

The PseudoColorShader is a basic shader that highlights low values in blue and high values in red. There is also ColorRampShader which maps the colors as specified by its color map. It has three modes of interpolation of values:

  • linear (INTERPOLATED): el color resultante se interpola linealmente desde las entradas del mapa de color por encima y por debajo del valor real del píxel

  • discrete (DISCRETE): el color se utiliza desde la entrada de mapa de color con valor igual o superior

  • exact (EXACT): el color no es interpolado, solamente los píxeles con valor igual al color del mapa de entrada es dibujado

To set an interpolated color ramp shader ranging from green to yellow color (for pixel values from 0 to 255):

rlayer.renderer().shader().setRasterShaderFunction(QgsColorRampShader())
lst = [QgsColorRampShader.ColorRampItem(0, QColor(0, 255, 0)), \
    QgsColorRampShader.ColorRampItem(255, QColor(255, 255 ,0))]
fcn = rlayer.renderer().shader().rasterShaderFunction()
fcn.setColorRampType(QgsColorRampShader.INTERPOLATED)
fcn.setColorRampItemList(lst)

To return back to default gray levels, use:

rlayer.setDrawingStyle('SingleBandGray')

Rásters multibanda

Por defecto, en los mapas de QGIS las primeras tres bandas a valores de rojo, verde y azul para crear una imagen en color (este es el estilo de dibujo MultiBandColor. En algunos casos es posible que desee anular estos ajustes. El siguiente código intercambia la banda roja (1) y la banda verde (2):

rlayer.setDrawingStyle('MultiBandColor')
rlayer.renderer().setGreenBand(1)
rlayer.setRedBand(2)

Actualizar capas

Si se hace el cambio de la simbología de capa y le gustaría asegurarse de que los cambios son inmediatamente visibles para el usuario, llame a estos métodos

if hasattr(layer, "setCacheImage"):
  layer.setCacheImage(None)
layer.triggerRepaint()

La primera llamada se asegurará de que la imagen en caché de la capa presentada se borra en caso de que el almacenamiento en caché este activado. Esta funcionalidad está disponible desde QGIS 1.4, en versiones anteriores no existe esta función — para asegurarse de que el código funciona con en todas las versiones de QGIS, primero comprobamos si existe el método.

La segunda llamada emite señal de que obligará a cualquier lienzo de mapa que contenga la capa de emitir una actualización.

Con capas ráster WMS, estos comandos no funcionan. En este caso, hay que hacerlo de forma explícita

layer.dataProvider().reloadData()
layer.triggerRepaint()

En caso de que haya cambiado la simbología de capa (ver secciones acerca de capas ráster y vectoriales sobre cómo hacerlo), es posible que desee forzar QGIS para actualizar la simbología de capa en la lista de capas (leyenda) de widgets. Esto se puede hacer de la siguiente manera (iface es una instancia de QgisInterface)

iface.legendInterface().refreshLayerSymbology(layer)

Valores de consulta

Para hacer una consulta sobre el valor de las bandas de capa ráster en algún momento determinado

ident = rlayer.dataProvider().identify(QgsPoint(15.30, 40.98), \
  QgsRaster.IdentifyFormatValue)
if ident.isValid():
  print ident.results()

El método results en este caso regresa un diccionario, con índices de bandas como llaves, y los valores de la banda como valores.

{1: 17, 2: 220}