Stylizujesz dyskretny raster za pomocą QGIS?

11

Mam rastry z dyskretnymi wartościami (kategorie Landuse, wartości boolowskie ...). Chciałbym móc stylizować je w dyskretny sposób:

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

Życzę czegoś takiego jak „Unikalne kategorie” w ArcGIS: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

Jednak wszystkie opcje, które widzę, obejmują rampy kolorów ... Czy coś przeoczyłem?


Otworzyłem żądanie funkcji, ponieważ wydaje się, że dostępne są tylko obejścia, a nie rozwiązania: http://hub.qgis.org/issues/14845

Stéphane Henriod
źródło

Odpowiedzi:

8

Możesz stworzyć niestandardowy schemat stylu, coś w rodzaju unikalnych kategorii, ale musisz ręcznie dodać wszystkie kategorie (przynajmniej muszę, ale używam starszej wersji QGIS).

Kliknij prawym przyciskiem myszy raster -> właściwości -> styl. Tam wybierz singleband pseudocolorjako Render typei kliknij mały czerwony plus, aby dodać własne wartości i odpowiadające im kolory. Coś w stylu: wprowadź opis zdjęcia tutaj

Pamiętaj, że możesz także użyć funkcji klasyfikowania, aby uzyskać wartości automatycznie, ale jeśli masz wartości dyskretne, lepiej byłoby po prostu dodać je ręcznie, zależy to od sposobu dystrybucji danych.

Jeśli twoje dane są zgodne ze wzorem, jeśli wynosi 0,1,2 .... 10, możesz ustawić Moderówny przedział, zdefiniować zakres Min:0, Max:10a następnie Classes:11kliknąć, Classifya wszystkie wartości otrzymasz automatycznie. Następnie możesz je zmienić według własnego uznania. wprowadź opis zdjęcia tutaj Wiem, że to nie jest idealne, ale to najlepsze, jakie do tej pory znalazłem. Może istnieć wtyczka, która rozwiązuje ten problem.

Hasan Mustafa
źródło
Miałem nadzieję na możliwość automatycznego pobrania wszystkich możliwych wartości mojego dyskretnego rastra, ale najwyraźniej to (jeszcze?) Nie istnieje. Dzięki!
Stéphane Henriod
O ile mi wiadomo, nie jest to jeszcze możliwe, ale może istnieć wtyczka, która to robi.
Hasan Mustafa
@ Stéph, aby automatycznie uzyskać cały zakres wartości: w „Load min / max values” możesz wybrać „min / max”, a następnie kliknąć „load”, a następnie ustawić liczbę klas obejmujących ten zakres (zgodnie z notatkami Hasana ) i kliknij „klasyfikuj”. Jeśli brakuje wartości w zakresie, musisz je ręcznie usunąć.
Simbamangu
2
Dzięki, to rzeczywiście obejście, którego używam. Ale nie uważam tego za bardzo intuicyjne, głównie gdy uczę Qgis nowych użytkowników. Co więcej, jeśli mam wartość „6”, której nie chcę wyświetlać na moim rastrze, mam problem: wszystkie piksele z „6” postawią kolor interpolowany między „5” i „7”. Mogę oczywiście powiedzieć, że „6” powinno być traktowane jako NoData, lub mogę użyć kalkulatora rastrowego, aby utworzyć nowy raster bez „6”, ale znowu są to wszystkie obejścia. Idealnie chciałbym mieć przycisk „Odzyskaj wszystkie pojedyncze wartości”. Sprawdzę, czy będzie to planowane w przyszłych wersjach ...
Stéphane Henriod,
1
Utworzyłem zgłoszenie dotyczące pokrewnego problemu: hub.qgis.org/issues/14449
Kurt Menke,
5

Oto szybki i brudny skrypt przetwarzania, który robi dokładnie to, o co prosisz (przepraszam za wybór koloru!). Umieść go w katalogu Processing scripts (np. C: \ Users \ .qgis2 \ processing \ scripts), a pojawi się w przyborniku Processing w Scripts> Raster.

Podziękowania dla Yury Ryabova za skrypt Unique_values_count.py, na którym jest oparty.

EDYCJA: Właśnie przesyłam żądanie ściągnięcia, aby przenieść je do repozytorium skryptów przetwarzania.

##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
źródło
To działa bezbłędnie, genialne rzeczy! Bezczelne żądanie, ale czy jest szansa na aktualizację etykiety, aby wyświetlała wartości w spisie treści? Z jakiegoś powodu ich nie pokazuje.
Ed Rollason,
Gotowe - właśnie zredagowałem scenariusz
Andy Harfoot
Wielkie dzięki! Btw Przygotowuję opis funkcji, aby taki moduł renderujący był zawarty w 3.0: docs.google.com/document/d/… Każdy, proszę sprawdzić / skomentować / zmodyfikować. Byłoby wspaniale móc z łatwością stylizować dyskretne rastry za pomocą dowolnego obejścia / skryptu, ...
Stéphane Henriod
4

Możesz spróbować:

1) Utwórz prosty styl we właściwościach warstwy, a następnie zapisz go w pliku eksportu za pomocą przycisku Zapisz. Są to w formie:

wartość, R, G, B, Alpha, etykieta

2) Użyj kategorii r. W przyborniku trawy (6 lub 7) modułu przetwarzającego. Powinno to dostarczyć listę wartości rastrowych. Skopiuj te wartości. Możesz użyć r.quantile dla ciągłych danych.

3) Otwórz plik eksportu zapisany wcześniej w edytorze tekstu (np. Notepad ++ w systemie Windows, mnóstwo opcji w systemie Linux). Wklej wartości i ponownie sformatuj, aby dopasować.

@Stephane

3a) W przypadku wartości dyskretnych możesz ustawić wartość alfa na 0 lub usunąć lub skomentować (używając # na początku wiersza) dowolne dane, których nie chcesz wyświetlać w pliku kategorii.

3b) W przypadku wartości ciągłych utwórz wiersz dla wartości początkowej i drugi dla wartości końcowej. Ustaw wartość alfa dla obu na 0.

4) Załóżmy na przykład, że utworzyłeś trzy pliki:

kategorie.txt - wyjście r.category, skopiuj i wklej, dodaj dwie puste linie u góry. Długość całkowita 1 kolumna. Sprawdź liczbę unikalnych wartości i utwórz styl z taką samą liczbą wpisów w QGIS.

colours.txt - plik eksportu mapy kolorów wygenerowany przez QGIS z kolorami, które lubisz. Całkowita długość 6 kolumn.

labels.txt - plik z żądanymi etykietami, dodaj dwie puste linie u góry. Długość całkowita 1 kolumna.

Użyj arkusza kalkulacyjnego, aby scalić pliki i zapisać je jako plik CSV. Otwórz to w QGIS.

Alternatywnie w wierszu poleceń (bash lub msys):

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

Zobacz też:

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

Zaawansowana paleta kolorów dla danych rastrowych

Vinh
źródło
Bardzo fajna metoda! Ale mimo to, jeśli w moim rastrze są pewne kategorie, których nie chcę wyświetlać, utknąłem ...
Stéphane Henriod