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

Style de représentation

Lorsqu’un raster est chargé, il récupère un style de représentation par défaut basé sur son type. Ce style peut être modifié dans les propriétés de la couche ou en programmant. On peut retrouver les styles d’affichage suivants:

Index

Constante: QgsRasterLater.X

Commentaire

1 SingleBandGray

Image mono-bande représentée avec une plage de niveaux de gris.

2 SingleBandPseudoColor

Image mono-bande représentée avec un algorithme de pseudo-couleurs.

3 PalettedColor

Image “Palette” représentée avec une table de couleurs.

4 PalettedSingleBandGray

Image “Palette” représentée en niveaux de gris.

5 PalettedSingleBandPseudoColor

Couche “Palette” dessinée avec un algorithme de pseudo-couleur

7 MultiBandSingleBandGray

Couche contenant au moins 2 bandes mais une seule bande est représentée selon une plage de niveaux de gris.

8 MultiBandSingleBandPseudoColor

Couche contenant au moins 2 bandes mais une seule bande est représentée à l’aide d’un algorithme de pseudo-couleur.

9 MultiBandColor

Couche contenant au moins 2 bandes, calquée sur un espace de couleur RGB.

Pour interroger le style de représentation actif

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

Ils sont rendus en niveaux de gris par défaut. Pour modifier le style de représentation en pseudo-couleur

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

La classe PseudoColorShader est un moteur de rendu simple qui met en valeur les faibles valeurs en bleu et les valeurs fortes en rouge. Il y a aussi ColorRampShader qui calque les couleurs selon sa carte de couleurs. Il dispose de trois modes d’interpolation des valeurs :

  • 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.

Pour appliquer une rampe de couleur interpolée qui part de vert vers le jaune (pour les pixels dont la valeur s’échelonne de 0 à 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)

Pour retourner aux niveaux de gris par défaut, utilisez

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}