Lo styling del raster discreto con QGIS?


11

Ho raster con valori discreti (categorie di Landuse, valori booleani ...). Vorrei poterli modellare in modo discreto:

0 -> Red
1 -> Blue
2 -> Green
...

Vorrei qualcosa di simile alle "Categorie uniche" in ArcGIS: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

Tuttavia, tutte le opzioni che vedo riguardano le rampe di colore ... Ho perso qualcosa?


Ho aperto una richiesta di funzionalità, poiché sembrano esserci solo soluzioni alternative, non soluzioni: http://hub.qgis.org/issues/14845

Risposte:


8

Puoi creare uno schema di stile personalizzato, qualcosa come categorie uniche ma dovrai aggiungere tutte le categorie manualmente (Atleast, ma sto usando una versione precedente di QGIS).

Fare clic con il tasto destro del mouse sullo stile raster -> proprietà ->. Lì scegli singleband pseudocolorcome Render typee fai clic sul plus piccolo rosso per aggiungere i tuoi valori e i colori corrispondenti. Qualcosa sulla falsariga di: inserisci qui la descrizione dell'immagine

Nota che puoi anche usare classify per ottenere automaticamente i valori ma se hai valori discreti potresti essere meglio di aggiungerli manualmente, dipende da come sono distribuiti i tuoi dati.

Se i dati segue un modello, se è 0,1,2 .... 10, è possibile impostare la Modealla parità di intervallo, definire l'intervallo Min:0, Max:10e Classes:11, cliccare Classifye avrete automaticamente tutti i valori. Quindi potresti modificarli come ritieni opportuno. inserisci qui la descrizione dell'immagine So che non è perfetto, ma questo è il migliore che ho trovato finora. Potrebbe esserci un plug-in che risolve questo problema.


Speravo nella possibilità di recuperare automaticamente tutti i possibili valori del mio discreto raster ma apparentemente questo non esiste (ancora?). Grazie!
Stéphane Henriod,

Per quanto ne so non è ancora possibile, ma potrebbe esserci un plugin che lo fa.
Hasan Mustafa,

@ Stéph, per ottenere automaticamente l'intero intervallo di valori: sotto 'Carica valori min / max' è possibile selezionare 'min / max' e quindi fare clic su 'carica', quindi impostare il numero di classi per coprire quell'intervallo (secondo le note di Hasan ) e fare clic su "classifica". Se hai valori mancanti nell'intervallo, dovrai eliminarli manualmente.
Simbamangu,

2
Grazie, questa è davvero la soluzione alternativa che uso. Ma non lo trovo molto intuitivo, soprattutto quando insegno Qgis a nuovi utenti. Inoltre, se ho un valore "6" che non voglio visualizzare sul mio raster, ho un problema: tutti i pixel con "6" scommetteranno un colore interpolato tra "5" e "7". Ovviamente posso dire che "6" dovrebbe essere considerato come NoData oppure posso usare la calcolatrice raster per creare un nuovo raster senza "6" ma, ancora una volta, sono tutte soluzioni alternative. Idealmente, vorrei un pulsante "Recupera tutti i singoli valori". Controllerò se è prevista per le versioni future ...
Stéphane Henriod,

1
Ho creato un ticket per un problema correlato: hub.qgis.org/issues/14449
Kurt Menke

5

Ecco uno script di elaborazione rapido e sporco che fa esattamente quello che stai chiedendo (scuse per le scelte di colore!). Inseriscilo nella directory degli script di elaborazione (ad es. C: \ Users \ .qgis2 \ processing \ scripts) e verrà visualizzato nella casella degli strumenti di elaborazione in Script> Raster.

Ringraziamo Yury Ryabov per lo script Unique_values_count.py su cui si basa.

EDIT: Sto solo inviando una richiesta pull per ottenere questo nel repository degli script di elaborazione.

##Raster=group
##Generate unique values style=name
##Raster_to_extract_unique_values=raster
##round_values_to_ndigits=number 0

from osgeo import gdal
from random import randint
import math
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.utils import iface

# Rename verbose input vars
input = Raster_to_extract_unique_values
rdig = round_values_to_ndigits

# Initialize unique values list
sort_values = []
# create set for unique values list
cell_values = set()

# load raster
gdalData =  gdal.Open(str(input))

# get width and heights of the raster
xsize = gdalData.RasterXSize
ysize = gdalData.RasterYSize

# get number of bands
bands = gdalData.RasterCount

# process the raster
for i in xrange(1, bands + 1):
    progress.setText("processing band " + str(i) + " of " + str(bands))
    band_i = gdalData.GetRasterBand(i)
    raster = band_i.ReadAsArray() # This loads the entire raster into memory!
    # count unique values for the given band
    for col in range( xsize ):
        if col % 10 == 0: progress.setPercentage(int(100*col/xsize))
        for row in range( ysize ):
            cell_value = raster[row, col]
            # check if cell_value is NaN - don't add if it is
            if not math.isnan(cell_value):
                # round floats if needed
                if rdig:
                    try:
                        cell_value = round(cell_value, int(rdig))
                    except:
                        cell_value = round(cell_value)
                # Add to the unique values set
                cell_values.add(cell_value)

del(gdalData)

# decide whether to sort by the count-column or the value-column
sort_values = sorted(cell_values)

# Now load the layer and apply styling
layer = processing.getObjectFromUri(input)

qCRS = QgsColorRampShader()

# Build the colour ramp using random colours
colList = ['#ff0000','#ffff00','#0000ff','#00ffff','#00ff00','#ff00ff']

lst = []
for i,val in enumerate(sort_values):
    lst.append(QgsColorRampShader.ColorRampItem(val,QColor(colList[i % 6]),str(val)))

qCRS.setColorRampItemList(lst)
qCRS.setColorRampType(QgsColorRampShader.EXACT)

shader = QgsRasterShader()
shader.setRasterShaderFunction(qCRS)

renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), layer.type(), shader)
layer.setRenderer(renderer)
layer.triggerRepaint()

Funziona perfettamente, roba geniale! Richiesta sfacciata, ma hai qualche possibilità di aggiornare l'etichetta in modo che mostri i valori nel sommario? Per qualche motivo non li sta mostrando.
Ed Rollason,

Fatto - appena modificato il copione
Andy Harfoot il

Molte grazie! A proposito, sto mettendo insieme una descrizione della funzione per includere un simile renderer in 3.0: docs.google.com/document/d/… Chiunque, sentitevi liberi di controllare / commentare / modificare. Sarebbe bello poter facilmente modellare i raster discreti con qualsiasi soluzione alternativa / scripting, ...
Stéphane Henriod

4

Puoi provare questo:

1) Crea uno stile semplice nelle proprietà del Livello, quindi salvalo in un file di esportazione usando il pulsante Salva. Questi sono nella forma:

valore, R, G, B, Alpha, etichetta

2) Utilizzare r.category nella casella degli strumenti grass (6 o 7) del modulo di elaborazione. Questo dovrebbe fornire un elenco di valori raster. Copia questi valori. È possibile utilizzare r.quantile per dati continui.

3) Apri il file di esportazione che hai salvato in precedenza in un editor di testo (ad esempio notepad ++ su Windows, un sacco di scelta su Linux). Incollare i valori e riformattare per adattarli.

@Stephane

3a) Per valori discreti, è possibile impostare l'alfa su 0 o eliminare o commentare (utilizzando # all'inizio della riga) tutti i dati che non si desidera visualizzare nel file della categoria.

3b) Per i valori continui, creare una riga per il valore iniziale e un'altra per il valore finale. Impostare l'alfa per entrambi su 0.

4) Ad esempio, supponi di aver creato tre file:

categorie.txt - output di r.category, copia e incolla, aggiungi due righe vuote in alto. Lunghezza totale 1 colonna. Controlla il numero di valori univoci e crea uno stile con lo stesso numero di voci in QGIS.

colours.txt - un file di esportazione della mappa dei colori generato da QGIS con i colori che ti piacciono. Lunghezza totale 6 colonne.

labels.txt: file con le etichette desiderate, aggiungere due righe vuote in alto. Lunghezza totale 1 colonna.

Utilizzare un foglio di calcolo per unire i file e salvarli come CSV. Apri questo in QGIS.

In alternativa, dalla riga di comando (bash o msys):

paste -d, categories.txt colours.txt labels.txt |cut -d, -f 1,3-6,8 > new_style.txt

Guarda anche:

https://pvanb.wordpress.com/2014/02/05/creating-a-qgis-color-map-from-text-file/

Tavolozza di colori avanzata per dati raster


Metodo molto bello! Ma comunque, se ci sono alcune categorie nel mio raster che non voglio visualizzare, sono bloccato ...
Stéphane Henriod
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.