Utiliser des couches raster

Cette section liste différentes opérations réalisables avec des couches raster.

Détails d’une couche

Une couche raster est constituée d’une ou plusieurs bandes raster — on la qualifie de mono-bande ou multi-bande. Une bande représente une matrice de valeurs. Les images en couleurs (par ex: photos aériennes) sont des rasters qui disposent de bandes rouge, vert et bleu. Les couches mono-bande représentent soit des variables continues (par ex: élévation) soit des variables discrètes (par ex: utilisation du sol). Dans certains cas, une couche raster comporte une palette et les valeurs du raster se réfèrent aux couleurs stockées dans la palette

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'

Les couches rasters mono-bande peuvent être affichées soit en niveaux de gris (faibles valeurs: noir, valeurs hautes = blanc) ou avec un algorithme de pseudo-couleurs qui affecte des couleurs aux valeurs de la bande unique. Les rasters mono-bande avec une palette peut être affichés en utilisant leur palette. Les couches multi-bandes sont affichées en calquant les bandes sur les couleurs RGB. L’autre possibilité est d’utiliser juste une bande pour le niveau de gris ou la pseudo-coleur.

Les sections qui suivent expliquent comment interroger et modifier le style de représentation de la couche. Une fois que les changements ont été effectués, vous pouvez forcer la mise à jour du canevas de carte avec Rafraîchir les couches.

**A FAIRE : **

Améliorations du contraste, transparence (pas de donnée), valeur maximale/minimale indiquée par l’utilisateur, statistiques sur la bande

Rasters mono-bande

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:

  • linéaire (INTERPOLATED): les couleurs résultent d’une interpolation linéaire des entrées de couleur de la carte qui sont en dessous et au dessus de la valeur du pixel actuel.

  • discret (DISCRETE): la couleur est utilisée depuis l’entrée de la carte de couleur avec une valeur supérieure ou égale.

  • exact (EXACT): la couleur n’est pas interpolée. Seuls les pixels dont la valeur équivaut aux entrées de la carte de couleur sont représentés.

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

Rasters multi-bandes

Par défaut, QGIS calque les trois premières bandes aux valeurs rouge, vert et bleue pour créer l’image en couleur (style de représentation MultiBandColor). Dans certains cas, vous voudrez modifier ce paramétrage. Le code qui suit intervertit les bandes rouge (1) et verte (2)

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

Rafraîchir les couches

Si vous modifiez la symbologie d’une couche et voulez que l’utilisateur en voit le résultat immédiatement, appelez ces méthodes

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

Le premier appel s’assurera que l’image en cache des couches rendues est effacé dans le cas où le cache est activé. Cette fonctionnalité est disponible depuis QGIS 1.4 et elle n’existait pas dans les versions précédentes. Pour s’assurer que le code fonctionne avec toutes les versions de QGIS, vérifions que la méthode existe.

La deuxième commande émet un signal forçant l’actualisation de tout canevas de carte contenant la couche.

Avec les couches raster WMS, ces commandes ne fonctionnent pas. Dans ce cas, vous devez le faire explicitement

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

Dans le cas où vous avez modifié la symbologie de la couche (consulter les sections sur les couches vectorielles et rasters pour savoir comment faire), vous voulez sans doute forcer QGIS à mettre à jour la symbologie de la couche dans la légende. Cela peut être réalisé comme suit (iface est une instance de la classe class:QgisInterface)

iface.legendInterface().refreshLayerSymbology(layer)

Interrogation des données

Pour récupérer la valeur des bandes d’une couche raster en un point donné

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

La méthode results renvoie dans ce cas un dictionnaire où les index de bandes correspondent aux clefs et les valeurs de bandes aux valeurs.

{1: 17, 2: 220}