Outdated version of the documentation. Find the latest one here.

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

Moteur de rendu

Lorsqu’un raster est chargé, il récupère un moteur de rendu par défaut basé sur son type. Ce moteur peut être modifié dans les propriétés de la couche ou par programmation.

Pour interroger le moteur de rendu actif

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

Pour paramétrer un moteur de rendu, utilisez la méthode setRenderer() de QgsRasterLayer. Il existe plusieurs classes de moteur de rendu (dérivées de QgsRasterRenderer):

  • QgsMultiBandColorRenderer
  • QgsPalettedRasterRenderer
  • QgsSingleBandColorDataRenderer
  • QgsSingleBandGrayRenderer
  • QgsSingleBandPseudoColorRenderer

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

Disons que nous souhaitons afficher notre couche raster (à un seule bande) avec des couleurs s’étalant du vert au jaune (pour une plage de valeur de pixel de 0 à 255). Nous allons d’abord préparer un objet QgsRasterShader et configurer sa fonction de 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)

Le shader affecte les couleurs comme indiqué par sa rampe de couleur. La rampe de couleur est fournie sous forme d’une liste contenant la valeur de pixel avec sa couleur associée. Il existe 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.

Dans un second temps, nous associons le shader avec la couche raster:

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

Le nombre 1 dans le code ci-dessus est le numéro de bande (les bandes de raster sont indexées à partir de un).

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

Dans le cas où seule une bande est nécessaire pour la visualisation du raster, le style mono-bande peut être sélectionné, soit en niveaux de gris, soit en pseudo-couleur.

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 voir comment faire), vous voudriez sans doute forcer QGIS à mettre à jour la symbologie de la couche dans la légende (panneau Couches). Cela peut être réalisé comme suit (iface est une instance de la classe 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}