Cette section liste différentes opérations réalisables avec des couches raster.
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 (ex: photos aériennes) sont des rasters qui disposent de bandes rouge,vert et bleu. Les rasters mono-bande représentent soir des variables continues (ex: l’élévation) ou des variables discrètes (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()
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
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:
>>> rlayer.drawingStyle()
9
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.
Améliorations du contraste, transparence (pas de donnée), valeur maximale/minimale indiquée par l’utilisateur, statistiques sur la bande
Ils sont rendus en niveaux de gris par défaut. Pour modifier le style de représentation à la pseudo-couleur:
>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandPseudoColor)
>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.PseudoColorShader)
Le PseudoColorShader
est un moteur de rendu qui met en valeur les faibles valeurs en bleu et les valeurs fortes en rouge. L’autre moteur, FreakOutShader
utilise des couleurs plus fantaisistes et selon la documentation, il effrayera votre grand-mère et fera aboyer vos chiens !
Il existe également le moteur ColorRampShader
qui calque les couleurs selon la carte des 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.setColorShadingAlgorithm(QgsRasterLayer.ColorRampShader)
>>> lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)), \
QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
>>> fcn = rlayer.rasterShader().rasterShaderFunction()
>>> fcn.setColorRampType(QgsColorRampShader.INTERPOLATED)
>>> fcn.setColorRampItemList(lst)
Pour retourner aux niveaux de gris par défaut, utilisez:
>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandGray)
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.setGreenBandName(rlayer.bandName(1))
>>> rlayer.setRedBandName(rlayer.bandName(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. Consultez la section précédente:
>>> rlayer.setDrawingStyle(QgsRasterLayer.MultiBandSingleBandPseudoColor)
>>> rlayer.setGrayBandName(rlayer.bandName(1))
>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.PseudoColorShader)
>>> # now set the shader
Si vous avez effectué des modifications sur le style d’une couche et tenez à ce qu’elles soient automatiquement visibles pour l’utilisateur, 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 vecteur et raster 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 QgisInterface):
iface.legendInterface().refreshLayerSymbology(layer)
Voici comment faire pour réaliser une interrogation de donnée sur les bandes d’une couche raster sur 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}