Această secțiune enumeră diverse operațiuni pe care le puteți efectua cu straturile raster.
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
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.
îmbunătățiri de contrast, de transparență (date nule), min/max definit de utilizator, statistici 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)
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
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)
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}