Usare i raster

Questa sezione elenca le varie operazioni che si possono eseguire sui raster.

Dettagli del raster

Un raster consiste di una o piú bande — puó essere sia a banda singola che multi banda. Ogni banda rappresenta una matrice di valori. Una normale immagine a colori (e.g. una foto aerea) é un raster composto dalle bande ross, blu e verde. I raster a singola banda solitamente rappresentano o variabili continue (e.g. altitudine) oppure variabili discrete (e.g. uso della terra). In alcuni casi, un raster é associato ad una tavolozza ed i valori del raster si riferiscono ai colori memorizzati nella tavolozza:

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'

I raster a banda singola possono essere mostrati sia tramite scala di grigi (valori bassi = nero, valori alti = bianco) o con un algoritmo per pseudocolori che assegna i colori per i valori della singola banda. I raster a banda singola con una tavolozza possono inoltre essere mostrati usando la loro tavolozza. I raster multibanda sono solitamente mostrati mappando le bande con i colori RGB. Un’altra possibilitá é quella di utilizzare una singola banda in scala di grigio o con pseudocolori.

Le prossime sezioni spiegano come interrogare e modificare lo stile del raster. Dopo aver effettuato i cambiamenti, potrebbe essere necessario forzare l’aggiornamento della mappa, vedi Aggiornare i Raster.

TODO:

miglioramenti sul contrasto, trasparenza (no data), min/max definiti dall’utente, statistiche sulla banda

Raster a Banda Singola

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:

  • linear (INTERPOLATED): il colore risultante é linearmente interpolato a partire dai valori dei colori della mappa al di sopra ed al di sotto del valore corrente

  • discrete (DISCRETE): il colore é preso dai colori della mappa aventi valore maggiore od uguale

  • exact (EXACT): il colore non é interpolato, vengono mostrati solo i pixel aventi valore uguale alla mappa dei colori

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

Raster Multi Banda

Come impostazione predefinita, QGIS mappa le prime tre bande con i valori rosso, verde e blu per creare un’immagine a colori (questo é lo stile MultiBandColor. In alcuni casi potrebbe essere utile modificare queste impostazioni. Il seguente codice scambia la banda rossa (1) con quella verde (2):

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

Aggiornare i Raster

Quando si cambia la simbologia di un raster ed essere sicuri che i cambiamenti siano immediatamente visibili agli utenti, si possono invocare i seguenti metodi

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

La prima chiamata garantisce che l’immagine in cache del layer mostrato sia cancellata nel caso in cui la cache della visualizzazione sia attivata. Questa funzionalitá é disponibile a partire da QGIS 1.4, tale funzione non esiste nelle versioni precedenti — per essere sicuri che il codice funzioni con tutte le versioni di QGIS, controlleremo prima che il metodo esista.

La seconda chiamata emette un segnale che forza la mappa contenente il layer ad aggiornarsi.

Questi comandi non funzionano con raster WMS. In questo caso va fatto in maniera esplicita

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

Nel caso sia stata cambiata la simbologia del raster (far riferimento alle sezioni riguardanti raster e vettori a tal proposito), si potrebbe voler forzare QGIS ad aggiornare la simbologia raster nella widget della lista dei raster (legend). Ció puó essere fatto come segue (iface é un’istanza di QgisInterface)

iface.legendInterface().refreshLayerSymbology(layer)

Valori dell’interrogazione

Per eseguire un’interrogazione sui valori delle bande di un raster in un punto specifico

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

Il metodo ``results``in questo caso restituisce un dizionario, usando gli indici delle bande come chiavi, ed i valori delle bande come valori.

{1: 17, 2: 220}