Utilizarea straturilor raster

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

Detaliile stratului

A raster layer consists of one or more raster bands - it is referred to as either single band or multi band raster. One band represents a matrix of values. Usual color image (e.g. aerial photo) is a raster consisting of red, blue and green band. Single band layers typically represent either continuous variables (e.g. elevation) or discrete variables (e.g. land use). In some cases, a raster layer comes with a palette and raster values refer to colors stored in the 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

Stilul desenării

Când un strat raster este încărcat, în funcție de tipul său, va moșteni un stil de desenare implicit. Acesta poate fi modificat, fie prin modificarea manuală a proprietăților rasterului, fie programatic. Există următoarele stiluri de desenare:

Index Constant: QgsRasterLater.X

Comentariu

1 SingleBandGray

Imagine cu o singură bandă, afișată într-o gamă de nuanțe de gri

2 SingleBandPseudoColor

Imagine cu bandă unică, desenată de un algoritm cu pseudoculori

3 PalettedColor “Palette” image drawn using color table
4 PalettedSingleBandGray “Palette” layer drawn in gray scale
5 PalettedSingleBandPseudoColor

“Paleta” stratului desenată de un algoritm cu o pseudoculoare

7 MultiBandSingleBandGray

Strat care conține 2 sau mai multe benzi, din care o singură bandă desenată într-o gamă cu tonuri de gri

8 MultiBandSingleBandPseudoColor

Strat care conține 2 sau mai multe benzi, din care o singură bandă este desenată folosind un algoritm cu pseudoculori

9 MultiBandColor

Strat conținând 2 sau mai multe benzi, mapate în spațiul de culori RGB.

To query the current drawing style:

>>> rlayer.drawingStyle()
9

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:

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

The PseudoColorShader is a basic shader that highlights low values in blue and high values in red. Another, FreakOutShader uses more fancy colors and according to the documentation, it will frighten your granny and make your dogs howl.

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

Pentru a seta o gamă de culori pentru umbrire interpolate, variind de la verde la galben (pentru valori ale pixelilor între 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)

To return back to default gray levels, use:

>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandGray)

Rastere multibandă

By default, QGIS maps the first three bands to red, green and blue values to create a color image (this is the MultiBandColor drawing style. In some cases you might want to override these setting. The following code interchanges red band (1) and green band (2):

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

In case only one band is necessary for visualization of the raster, single band drawing can be chosen — either gray levels or pseudocolor, see previous section:

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

Recitirea straturilor

If you do change layer symbology and would like ensure that the changes are immediately visible to the user, call these methods:

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.

With WMS raster layers, these commands do not work. In this case, you have to do it explicitly:

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

In case you have changed layer symbology (see sections about raster and vector layers on how to do that), you might want to force QGIS to update the layer symbology in the layer list (legend) widget. This can be done as follows (iface is an instance of QgisInterface):

iface.legendInterface().refreshLayerSymbology(layer)

Interogarea valorilor

To do a query on value of bands of raster layer at some specified point:

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}