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

Renderizador

Cuando se carga una capa ráster, se asigna un estilo de renderizado basado en la escritura. Se puede cambiar en las propiedades de la capa ráster o de manera programática.

Para consultar el renderizador actual:

>>> rlayer.renderer()
<qgis._core.QgsSingleBandPseudoColorRenderer object at 0x7f471c1da8a0>
>>> rlayer.renderer().type()
u'singlebandpseudocolor'

Para establecer un renderizado utilice el método setRenderer() de QgsRasterLayer. Hay varios clases de renderizadores disponibles (derivado de QgsRasterRenderer):

  • QgsMultiBandColorRenderer
  • QgsPalettedRasterRenderer
  • QgsSingleBandColorDataRenderer
  • QgsSingleBandGrayRenderer
  • QgsSingleBandPseudoColorRenderer

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

Vamos a decir que queremos representar nuestra capa ráster (asuma sólo una banda) con rango de colores de verde a amarillo (para valores de píxel de 0 a 255). En la primer escena prepararemos el objeto QgsRasterShader y configuraremos su función de sombreado:

>>> 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)

Los colores del mapa de sombreado como se especifican por su mapa de color. El mapa de color se proporciona como una lista de elementos con valores de píxel y su color asociado. Hay tres modos de interpolación de valores:

  • 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

En el segundo paso asociaremos este sombreado con la capa ráster:

>>> renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), 1, shader)
>>> layer.setRenderer(renderer)

El número 1 en el código anterios es el número de la banda (bandas ráster estan indexadas de uno).

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.renderer().setGreenBand(1)
rlayer.renderer().setRedBand(2)

En caso de que sólo una banda sea necesaria para visualizar del ráster, sólo una banda dibujada puede elegir — cualquiera de los niveles gris o pseudocolor.

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}