Utilizarea straturilor raster

Această secțiune enumeră diverse operațiuni pe care le puteți efectua cu straturile raster.

Detaliile stratului

Un strat raster constă într-una sau mai multe benzi raster - cu referire la rastere cu o singură bandă sau multibandă. O bandă reprezintă o matrice de valori. Imaginea color obișnuită (cum ar fi o fotografie aeriană) este un format raster cu o bandă roșie, una albastră și una verde. Straturile cu bandă unică reprezintă, de obicei, fie variabile continue (de exemplu, elevația) fie variabile discrete (cum ar fi utilizarea terenului). În unele cazuri, un strat raster vine cu o paletă, iar valorile rasterului fac referire la culorile stocate în paletă:

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'

Straturile cu o singură bandă raster pot fi desenate fie în nuanțe de gri (valori mici = negru, valori ridicate = alb), sau cu un algoritm cu pseudoculori, care atribuie culori valorilor din banda singulară. Rasterele cu o singură bandă pot fi desenate folosindu-se propria paletă. Straturile multibandă sunt, de obicei, desenate prin maparea benzilor la culori RGB. Altă posibilitate este de a utiliza doar o singură bandă pentru desenarea în tonuri de gri sau cu pseudoculori.

Următoarele secțiuni explică modul în care se poate interoga și modifica stilul de desenare al stratului. După efectuarea schimbărilor, ați putea forța actualizarea suprafeței hărții, a se vedea Recitirea straturilor.

DE EFECTUAT:

îmbunătățiri de contrast, de transparență (date nule), min/max definit de utilizator, statistici bandă

Rastere cu o singură bandă

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:

  • liniar (INTERPOLAT ): culoarea rezultată fiind interpolată liniar, de la intrările hărții de culori, în sus sau în jos față de valoarea înscrisă în harta de culori

  • discret (DISCRET): culorile folosite fiind cele cu o valoare egală sau mai mare față de cele din harta de culori

  • exact (EXACT): culoarea nu este interpolată, desenându-se doar pixelii cu o valoare egală cu cea introdusă în harta de culori

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

Rastere multibandă

În mod implicit, QGIS mapează primele trei benzi la valori de roșu, verde și albastru, pentru a crea o imagine color (desenată în stilul MultiBandColor. În unele cazuri, ați putea dori să suprascrieți aceste setări. Următorul cod inversează banda roșie (1) cu cea verde (2):

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

Recitirea straturilor

Dacă schimbați simbologia stratului și ați vrea să vă asigurați că schimbările sunt imediat vizibile pentru utilizator, puteți apela aceste metode

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

Primul apel garantează că imaginea din cache a stratului este ștearsă în cazul în care cache-ul este activat. Această funcționalitate este disponibilă începând de la QGIS 1.4, în versiunile anterioare această funcție neexistând — pentru a fi siguri de cod, că funcționează cu toate versiunile de QGIS, vom verifica în primul rând dacă metoda există.

Al doilea apel emite semnalul care va forța orice suport de hartă, care conține stratul, să emită o reîmprospătare.

Aceste comenzi nu funcționează în cazul straturilor raster WMS. În acest caz, trebuie să specificați în mod explicit

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

În cazul în care s-a schimbat simbologia stratului (a se vedea secțiunea despre straturile raster și cele vectoriale cu privire la modul cum se face acest lucru), ați putea forța QGIS să actualizeze simbologia din lista straturilor (legendă). Acest lucru poate fi realizat după cum urmează (iface este o instanță a QgisInterface)

iface.legendInterface().refreshLayerSymbology(layer)

Interogarea valorilor

Pentru a face, la un moment dat, o interogare asupra valorilor din benzile stratului raster

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

În acest caz, metoda results returnează un dicționar, cu indicii benzii ca și chei, și valorile benzii ca valori.

{1: 17, 2: 220}