Styling raster diskrit menggunakan QGIS?

11

Saya memiliki raster dengan nilai diskrit (kategori Landuse, nilai boolean ...). Saya ingin dapat menata mereka secara terpisah:

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

Saya berharap sesuatu seperti "Kategori Unik" di ArcGIS: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000000000000/

Namun, semua opsi yang saya lihat melibatkan landai warna ... Apakah saya melewatkan sesuatu?


Saya telah membuka permintaan fitur, karena sepertinya hanya ada solusi yang tersedia, bukan solusi: http://hub.qgis.org/issues/14845

Stéphane Henriod
sumber

Jawaban:

8

Anda dapat membuat skema gaya khusus, seperti kategori unik tetapi Anda harus menambahkan semua kategori secara manual (Setidaknya saya harus melakukannya, tapi saya menggunakan versi QGIS yang lebih lama).

Klik kanan raster -> properties -> style. Di sana pilih singleband pseudocolorsebagai Render typedan klik pada sedikit merah plus untuk menambahkan nilai Anda sendiri dan warna yang sesuai. Sesuatu di sepanjang garis: masukkan deskripsi gambar di sini

Perhatikan bahwa Anda juga dapat menggunakan klasifikasi untuk mendapatkan nilai secara otomatis, tetapi jika Anda memiliki nilai diskrit, Anda mungkin lebih baik hanya menambahkannya secara manual, tergantung pada bagaimana data Anda didistribusikan.

Jika data Anda mengikuti pola, jika itu adalah 0,1,2 .... 10, Anda bisa mengatur Modeinterval ke yang sama, menentukan rentang Min:0, Max:10dan Classes:11, klik Classifydan Anda akan mendapatkan semua nilai secara otomatis. Maka Anda bisa mengubahnya sesuai keinginan Anda. masukkan deskripsi gambar di sini Saya tahu itu tidak sempurna, tetapi ini adalah yang terbaik yang saya temukan sejauh ini. Mungkin ada plugin yang menangani masalah ini.

Hasan Mustafa
sumber
Saya berharap kemungkinan untuk secara otomatis mengambil semua nilai yang mungkin dari raster diskrit saya tetapi ternyata ini belum (belum?) Ada. Terima kasih!
Stéphane Henriod
Sejauh yang saya tahu belum mungkin, tetapi mungkin ada plugin yang melakukan ini.
Hasan Mustafa
@ Stéph, untuk secara otomatis mendapatkan seluruh rentang nilai: di bawah 'Muat nilai min / maks' Anda dapat memilih 'min / maks' dan kemudian klik 'muat', lalu atur jumlah kelas untuk mencakup rentang itu (sesuai catatan Hasan ) dan klik 'klasifikasi'. Jika Anda memiliki nilai yang hilang dalam rentang tersebut, Anda harus menghapusnya secara manual.
Simbamangu
2
Terima kasih, itu memang solusi yang saya gunakan. Tapi saya tidak menemukannya sangat intuitif, terutama ketika saya mengajar Qgis kepada pengguna baru. Selain itu, jika saya memiliki nilai "6" yang tidak ingin saya tampilkan di raster saya, saya punya masalah: semua piksel dengan "6" akan bertaruh warna yang diinterpolasi antara "5" dan "7". Tentu saja saya dapat mengatakan bahwa "6" harus dianggap sebagai NoData atau saya dapat menggunakan kalkulator raster untuk membuat raster baru tanpa "6" tetapi, sekali lagi, itu semua adalah solusi. Idealnya, saya ingin tombol "Ambil semua nilai tunggal". Saya akan memeriksa apakah ini direncanakan untuk versi masa depan ...
Stéphane Henriod
1
Saya telah membuat tiket untuk masalah terkait: hub.qgis.org/issues/14449
Kurt Menke
5

Berikut ini adalah skrip Pemrosesan yang cepat dan kotor yang melakukan persis apa yang Anda minta (permintaan maaf untuk pilihan warna!). Letakkan di direktori skrip pemrosesan Anda (mis. C: \ Users \ .qgis2 \ processing \ scripts) dan itu akan muncul di kotak alat Pemrosesan di bawah Skrip> Raster.

Penghargaan untuk Yury Ryabov untuk skrip Unique_values_count.py yang menjadi dasar skrip ini.

EDIT: Saya hanya mengirimkan permintaan tarik untuk memasukkan ini ke dalam repositori pemrosesan skrip.

##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
sumber
Itu bekerja dengan sempurna, hal-hal brilian! Permintaan kurang ajar, tetapi ada kemungkinan memperbarui label sehingga menunjukkan nilai-nilai di TOC? Untuk beberapa alasan itu tidak menunjukkan kepada mereka.
Ed Rollason
Selesai - baru saja mengedit naskah
Andy Harfoot
Terima kasih banyak! Btw saya sedang menyusun beberapa deskripsi fitur agar renderer seperti itu dimasukkan dalam 3.0: docs.google.com/document/d/... Siapa pun, jangan ragu untuk memeriksa / berkomentar / memodifikasi. Akan luar biasa untuk dapat dengan mudah mendesain raster diskrit dengan menggunakan solusi / skrip apa pun, ...
Stéphane Henriod
4

Anda bisa mencoba ini:

1) Buat gaya sederhana di properti Layer, lalu simpan ke file ekspor menggunakan tombol simpan. Ini dalam bentuk:

nilai, R, G, B, Alpha, label

2) Gunakan r.category di kotak alat rumput (6 atau 7) dari modul pemrosesan. Ini harus menyediakan daftar nilai raster. Salin nilai-nilai ini. Anda dapat menggunakan r.quantile untuk data kontinu.

3) Buka file ekspor yang Anda simpan sebelumnya di editor teks (mis. Notepad ++ di windows, banyak pilihan di linux). Tempel nilai dan format ulang sesuai.

@Sthane

3a) Untuk nilai diskrit, Anda dapat mengatur alpha ke 0, atau menghapus atau mengomentari (menggunakan # di awal baris) data apa pun yang tidak ingin Anda tampilkan dalam file kategori.

3b) Untuk nilai kontinu, buat baris untuk nilai awal dan lainnya untuk nilai akhir. Atur alpha untuk keduanya ke 0.

4) Misalnya, katakan Anda telah membuat tiga file:

category.txt - output dari r.category, salin dan tempel, tambahkan dua baris kosong di bagian atas. Total panjang 1 kolom. Periksa jumlah nilai unik, dan buat gaya dengan jumlah entri yang sama di QGIS.

colours.txt - File Ekspor Peta Warna Yang Dihasilkan QGIS dengan warna yang Anda suka. Total panjang 6 kolom.

labels.txt - file dengan label yang Anda inginkan, tambahkan dua baris kosong di bagian atas. Total panjang 1 kolom.

Gunakan spreadsheet untuk menggabungkan file dan menyimpannya sebagai csv. Buka ini di QGIS.

Atau, di baris perintah (bash atau msys):

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

Lihat juga:

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

Palet warna tingkat lanjut untuk data raster

cih
sumber
Metode yang sangat bagus! Tapi tetap saja, jika ada beberapa kategori dalam raster saya yang tidak ingin saya tampilkan, saya macet ...
Stéphane Henriod