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

Rasterlagen gebruiken

Deze gedeelten vermelden verschillende bewerkingen die u kunt uitvoeren met rasterlagen.

Details laag

Een rasterlaag bestaat uit één of meer rasterbanden - er wordt naar verwezen als een ofwel enkelband of een multiband raster. Een band vertegenwoordigt een matrix van waarden. Gewoonlijk een kleurenafbeelding (bijv. luchtfoto) bestaat een raster uit een rode, blauwe en groene band. Lagen met één enkele band vertegenwoordigen meestal ofwel doorlopende variabelen (bijv. hoogte) of afzonderlijke variabelen (bijv. landgebruik). In sommige gevallen heeft een rasterlaag een palet en verwijzen waarden in het raster naar de kleuren die zijn opgeslagen in het palet.

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

Tekenstijl

Wanneer een raster wordt geladen krijgt het een standaard stijl om te tekenen, gebaseerd op zijn type. Die kan worden gewijzigd, ofwel in de eigenschappen van de laag of programmatisch. De volgende stijlen voor tekenen bestaan:

Index

Constante: QgsRasterLater.X

Opmerking

1 SingleBandGray

Enkelbands afbeelding getekend als een bereik van grijswaarden

2 SingleBandPseudoColor

Enkelbands afbeelding getekend met behulp van een algoritme voor pseudokleur

3 PalettedColor

“Palet”-afbeelding getekend met behulp van ene kleurentabel

4 PalettedSingleBandGray

“Palet”-laag getekend in grijswaarden

5 PalettedSingleBandPseudoColor

“Palet”-laag tekenen met behulp van een algoritme voor pseudokleur

7 MultiBandSingleBandGray

Laag die 2 of meer banden bevat, maar een enkele band getekend als een bereik van grijswaarden

8 MultiBandSingleBandPseudoColor

Laag die 2 of meer banden bevat, maar een enkele band getekend met behulp van een algoritme voor pseudokleur

9 MultiBandColor

Laag die 2 of meer banden bevat, in kaart gebracht met de RGB-kleurruimte.

De huidige stijl van tekenen bevragen:

>>> rlayer.drawingStyle()
9

Enkelbands rasterlagen kunnen worden getekend ofwel in grijze kleuren (lage waarden = zwart, hoge waarden = wit) of met een algoritme voor pseudokleur dat kleuren toewijst voor de waarden uit de enkele band. Enkelbands rasters met een palet kunnen aanvullend worden getekend met behulp van hun palet. Multiband-lagen worden gewoonlijk getekend door de banden in kaart te brengen als RGB-kleuren. Een andere mogelijkheid is om slechts één band voor grijs of teken in pseudokleur te gebruiken.

De volgende gedeelten leggen uit hoe de tekenstijl voor de laag te bevragen en aan te passen. U zou, na het aanbrengen van de wijzigingen, het bijwerken van het kaartvenster willen forceren, zie Lagen vernieuwen.

TODO:

verbeteringen van contrast, transparantie (geen gegevens), gebruikergedefinieerde statistieken min/max, band

Enkelbands rasters

Zij worden standaard gerenderd in grijze kleuren. De tekenstijl wijzigen naar pseudokleur:

>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandPseudoColor)
>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.PseudoColorShader)

De PseudoColorShader is een basiskleurenbalk die lage waarden in blauw en hoge waarden in rood accentueert. Een andere, FreakOutShader, gebruikt meer kleurrijke kleuren en volgens de documentatie, zal het uw oma bang maken en uw honden laten huilen.

Er is ook ColorRampShader dat de kleuren in kaart brengt zoals gespecificeerd door zijn kleurenkaart. Het heeft drie modi voor de interpolatie van waarden:

  • linear (INTERPOLATED): resulterende kleur wordt lineair geïnterpoleerd uit de items van de kleurenkaart boven en onder de actuele pixelwaarde

  • discrete (DISCRETE): kleur wordt gebruikt uit het item voor de kleurenkaart met gelijke of hogere waarde

  • exact (EXACT): kleur wordt niet geïnterpoleerd, alleen de pixels met een waarde gelijk aan die van de kleurenkaart worden getekend

Een interpolerende kleurenbalk instellen voor het bereik van groene naar gele kleur (voor pixelwaarden van 0 tot en met 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)

Gebruik, om terug te keren naar de standaard grijze niveaus:

>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandGray)

Multiband rasters

Standaard brengt QGIS de eerste drie banden in kaart naar rode, groene en blauwe waarden om een kleurenafbeelding te maken (dit is de tekenstijl MultiBandColor. In sommige gevallen zou u deze instellen willen overschrijven. De volgende code verwisselt de rode band (1) met de groene band (2):

>>> rlayer.setGreenBandName(rlayer.bandName(1))
>>> rlayer.setRedBandName(rlayer.bandName(2))

In het geval dat slechts één band nodig is voor de visualisatie van het raster, kan het tekenen van ene enkele band worden gekozen — ofwel grijswaarden of pseudokleur, zie het eerdere gedeelte:

>>> rlayer.setDrawingStyle(QgsRasterLayer.MultiBandSingleBandPseudoColor)
>>> rlayer.setGrayBandName(rlayer.bandName(1))
>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.PseudoColorShader)
>>> # now set the shader

Lagen vernieuwen

Indien u de symbologie van de laag wijzigt en er voor willen zorgen dat de wijzigingen onmiddellijk zichtbaar zijn voor de gebruiker, roep dan deze methoden aan:

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

De eerste aanroep zal er voor zorgen dat de afbeelding van de gerenderde laag in de cache wordt gewist in het geval dat caching van renderen is ingeschakeld. Deze functionaliteit is beschikbaar vanaf QGIS 1.4, in eerdere versies bestaat deze functie niet — om er voor te zorgen dat de code werkt met alle versies van QGIS, controleren we eerst of de methode bestaat.

De tweede aanroep verzendt het signaal dat een kaartvenster dat de laag bevat zal forceren het te vernieuwen.

Met rasterlagen van een WMS werken deze opdrachten niet. In dat geval dient u het expliciet te doen:

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

In het geval dat u symbologie voor lagen heeft gewijzigd (bekijk de gedeelten over raster- en vectorlagen om te zien hoe u dat doet), wilt u misschien QGIS forceren om de symbologie voor de lagen in de widget Lagenlijst (legenda) bij te werken. dat kan als volgt worden gedaan (iface is een instance van QgisInterface):

iface.legendInterface().refreshLayerSymbology(layer)

Waarden bevragen

Een query uitvoeren op waarden van banden van een rasterlaag op een gespecificeerd punt:

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

De methode results geeft in dit geval een woordenboek terug, met indices van banden als sleutels, en bandwaarden als waarden.

{1: 17, 2: 220}