Diskretes Raster mit QGIS stylen?

11

Ich habe Raster mit diskreten Werten (Landnutzungskategorien, Boolesche Werte ...). Ich möchte sie diskret stylen können:

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

Ich wünsche mir so etwas wie die "eindeutigen Kategorien" in ArcGIS: http://resources.arcgis.com/de/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

Alle Optionen, die ich sehe, beinhalten jedoch Farbrampen ... Habe ich etwas verpasst?


Ich habe eine Funktionsanforderung geöffnet, da anscheinend nur Problemumgehungen verfügbar sind, keine Lösungen: http://hub.qgis.org/issues/14845

Stéphane Henriod
quelle

Antworten:

7

Sie können ein benutzerdefiniertes Stilschema erstellen, ähnlich wie eindeutige Kategorien, aber Sie müssen alle Kategorien manuell hinzufügen (zumindest muss ich, aber ich verwende eine ältere Version von QGIS).

Klicken Sie mit der rechten Maustaste auf das Raster -> Eigenschaften -> Stil. Wählen Sie dort singleband pseudocolorals Render typeund klicken Sie auf das kleine rote Plus, um Ihre eigenen Werte und entsprechenden Farben hinzuzufügen. Etwas in der Art von: Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass Sie auch classify verwenden können, um die Werte automatisch abzurufen. Wenn Sie jedoch diskrete Werte haben, können Sie diese möglicherweise besser manuell hinzufügen. Dies hängt davon ab, wie Ihre Daten verteilt sind.

Wenn Ihre Daten ein Muster folgt, wenn es 0,1,2 ist .... 10, können Sie das Set Modezu gleichen Intervall, definieren den Bereich Min:0, Max:10und Classes:11klicken Sie auf, Classifyund Sie werden automatisch alle die Werte erhalten. Dann können Sie sie nach Belieben ändern. Geben Sie hier die Bildbeschreibung ein Ich weiß, dass es nicht perfekt ist, aber das ist das Beste, was ich bisher gefunden habe. Möglicherweise gibt es ein Plugin, das sich mit diesem Problem befasst.

Hasan Mustafa
quelle
Ich hatte auf die Möglichkeit gehofft, automatisch alle möglichen Werte meines diskreten Rasters abzurufen, aber anscheinend existiert dies (noch?) Nicht. Vielen Dank!
Stéphane Henriod
Soweit mir bekannt ist, ist dies noch nicht möglich, aber es könnte ein Plugin geben, das dies tut.
Hasan Mustafa
@ Stéph, um automatisch den gesamten Wertebereich abzurufen: Unter 'Min / Max-Werte laden' können Sie 'Min / Max' auswählen und dann auf 'Laden' klicken und dann die Anzahl der Klassen festlegen, die diesen Bereich abdecken (gemäß Hasans Notizen) ) und klicken Sie auf 'klassifizieren'. Wenn Sie fehlende Werte im Bereich haben, müssen Sie diese manuell löschen.
Simbamangu
2
Danke, das ist in der Tat die Problemumgehung, die ich verwende. Aber ich finde es nicht sehr intuitiv, vor allem, wenn ich neuen Benutzern Qgis beibringe. Wenn ich einen Wert "6" habe, den ich nicht in meinem Raster anzeigen möchte, habe ich außerdem ein Problem: Alle Pixel mit "6" setzen auf eine zwischen "5" und "7" interpolierte Farbe. Ich kann natürlich sagen, dass "6" als NoData betrachtet werden sollte, oder ich kann den Rasterrechner verwenden, um ein neues Raster ohne "6" zu erstellen, aber auch dies sind alles Problemumgehungen. Idealerweise würde ich mir eine Schaltfläche "Alle Einzelwerte abrufen" wünschen. Ich werde prüfen, ob es für zukünftige Versionen geplant ist ...
Stéphane Henriod
1
Ich habe ein Ticket für ein verwandtes Problem erstellt: hub.qgis.org/issues/14449
Kurt Menke
5

Hier ist ein schnelles und schmutziges Verarbeitungsskript, das genau das tut, was Sie verlangen (Entschuldigung für die Farbauswahl!). Legen Sie es in Ihrem Verarbeitungsskriptverzeichnis ab (z. B. C: \ Benutzer \ .qgis2 \ Verarbeitung \ Skripte), und es wird in der Verarbeitungs-Toolbox unter Skripte> Raster angezeigt.

Dank an Yury Ryabov für das Skript Unique_values_count.py, auf dem dies basiert.

BEARBEITEN: Ich sende nur eine Pull-Anfrage, um diese in das Repository für Verarbeitungsskripte zu übertragen.

##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()
Andy Harfoot
quelle
Das funktioniert einwandfrei, geniales Zeug! Freche Anfrage, aber eine Chance, das Etikett so zu aktualisieren, dass es die Werte im Inhaltsverzeichnis anzeigt? Aus irgendeinem Grund werden sie nicht angezeigt.
Ed Rollason
Fertig - gerade das Skript bearbeitet
Andy Harfoot
Danke vielmals! Übrigens stelle ich eine Funktionsbeschreibung zusammen, um einen solchen Renderer in 3.0 aufzunehmen: docs.google.com/document/d/… Jeder kann dies überprüfen / kommentieren / ändern. Es wäre großartig, diskrete Raster mit jedem Workaround / Scripting einfach zu stylen, ...
Stéphane Henriod
4

Sie könnten dies versuchen:

1) Erstellen Sie einen einfachen Stil in den Ebeneneigenschaften und speichern Sie ihn dann über die Schaltfläche Speichern in einer Exportdatei. Diese sind in der Form:

Wert, R, G, B, Alpha, Label

2) Verwenden Sie r.category in der Gras-Toolbox (6 oder 7) des Verarbeitungsmoduls. Dies sollte eine Liste von Rasterwerten enthalten. Kopieren Sie diese Werte. Sie können r.quantile für kontinuierliche Daten verwenden.

3) Öffnen Sie die zuvor gespeicherte Exportdatei in einem Texteditor (z. B. Notepad ++ unter Windows, jede Menge Auswahl unter Linux). Fügen Sie die Werte ein und formatieren Sie sie entsprechend neu.

@Stephane

3a) Für diskrete Werte können Sie das Alpha auf 0 setzen oder alle Daten, die Sie nicht in der Kategoriedatei anzeigen möchten, löschen oder auskommentieren (mit # am Zeilenanfang).

3b) Erstellen Sie für fortlaufende Werte eine Zeile für den Startwert und eine weitere für den Endwert. Setzen Sie das Alpha für beide auf 0.

4) Angenommen, Sie haben drei Dateien erstellt:

category.txt - Ausgabe von r.category, Kopieren und Einfügen, zwei leere Zeilen oben hinzufügen. Gesamtlänge 1 Spalte. Überprüfen Sie die Anzahl der eindeutigen Werte und erstellen Sie einen Stil mit der gleichen Anzahl von Einträgen in QGIS.

colours.txt - eine von QGIS generierte Farbkarten-Exportdatei mit den gewünschten Farben. Gesamtlänge 6 Spalten.

label.txt - Datei mit den gewünschten Beschriftungen. Fügen Sie oben zwei Leerzeilen hinzu. Gesamtlänge 1 Spalte.

Verwenden Sie eine Tabelle, um die Dateien zusammenzuführen und als CSV zu speichern. Öffnen Sie dies in QGIS.

Alternativ über die Befehlszeile (bash oder msys):

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

Siehe auch:

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

Erweiterte Farbpalette für Rasterdaten

vinh
quelle
Sehr schöne Methode! Aber dennoch, wenn es einige Kategorien in meinem Raster gibt, die ich nicht anzeigen möchte, stecke ich fest ...
Stéphane Henriod