QGIS kullanarak ayrık raster şekillendirme?


11

Ayrık değerlere sahip rasterlerim var (Landuse kategorileri, boole değerleri ...). Onları ayrı bir tarzda şekillendirmek istiyorum:

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

ArcGIS'teki "Benzersiz Kategoriler" gibi bir şey diliyorum: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

Ancak, gördüğüm tüm seçenekler renk rampaları içeriyor ... Bir şey kaçırdım mı?


Bir özellik isteği açtım, çünkü çözümler değil, yalnızca geçici çözümler var gibi görünüyor: http://hub.qgis.org/issues/14845

Yanıtlar:


8

Özel bir stil düzeni oluşturabilirsiniz, benzersiz kategoriler gibi bir şey ancak tüm kategorileri manuel olarak eklemeniz gerekir (En azından yapmak zorundayım, ancak QGIS'in eski bir sürümünü kullanıyorum).

Raster -> özellikler -> stile sağ tıklayın. Orada seçim yılında singleband pseudocolorolduğu gibi Render typeve artı küçük kırmızı tıklayarak kendi değerlerinizi ve buna bağlı renklere ekleyin. Çizgileri boyunca bir şey: resim açıklamasını buraya girin

Ayrıca, değerleri otomatik olarak almak için sınıflandırmayı da kullanabileceğinizi unutmayın, ancak ayrık değerleriniz varsa, bunları manuel olarak eklemekten daha iyi olabilirsiniz, verilerinizin nasıl dağıtıldığına bağlıdır.

O 0,1,2 .... 10 ise veri, bir yol izler varsa, ayarlayabilirsiniz Mode, eşit aralığına aralığı tanımlamak Min:0, Max:10ve Classes:11, tıklayın Classifyve otomatik olarak tüm değerleri elde edersiniz. Sonra uygun gördüğünüz gibi onları değiştirebilirsiniz. resim açıklamasını buraya girin Mükemmel olmadığını biliyorum, ama bu şimdiye kadar bulduğum en iyisi. Bu konuyla ilgilenen bir eklenti olabilir.


Ayrık rasterimin tüm olası değerlerini otomatik olarak alma olasılığını umuyordum ama görünüşe göre bu mevcut değil (henüz?). Teşekkürler!
Stéphane Henriod

Bildiğim kadarıyla henüz mümkün değil, ancak bunu yapan bir eklenti olabilir.
Hasan Mustafa

@ Stéph, tüm değer aralığını otomatik olarak almak için: 'Min / maks değerleri yükle' altında 'min / max' seçeneğini seçebilir ve ardından 'yükle'yi tıklayabilir, ardından bu aralığı kapsayacak şekilde sınıf sayısını ayarlayabilirsiniz (Hasan'ın notlarına göre) ) ve "sınıflandır" ı tıklayın. Aralıkta eksik değerleriniz varsa bunları manuel olarak silmeniz gerekir.
Simbamangu

2
Teşekkürler, bu gerçekten kullandığım geçici çözüm. Ama çoğunlukla sezgilere yeni kullanıcılara öğrettiğimde bunu çok sezgisel bulmuyorum. Dahası, rasterimde göstermek istemediğim bir "6" değerine sahipsem, bir sorunum var: "6" olan tüm pikseller "5" ile "7" arasında enterpolasyonlu bir renkte bahse girer. Tabii ki "6" NoData olarak kabul edilmelidir diyebilirim ya da "6" olmadan yeni bir raster oluşturmak için raster hesap makinesi kullanabilirsiniz, ama yine, bunların hepsi geçici çözümler. İdeal olarak, bir düğme "Tüm tek değerleri almak" isterdim. Gelecek sürümler için planlanıp planlanmadığını kontrol edeceğim ...
Stéphane Henriod

1
İlgili bir konuda bir bilet oluşturdum: hub.qgis.org/issues/14449
Kurt Menke

5

İşte tam olarak istediğinizi yapan hızlı ve kirli bir İşleme betiği (renk seçenekleri için özür dileriz!). İşleme komut dosyaları dizininize (örn. C: \ Kullanıcılar \ .qgis2 \ işleme \ komut dosyaları) koyun; Komut Dosyaları> Tarama altındaki İşlem araç kutusunda görünür.

Bunun dayandığı Unique_values_count.py betiği için Yury Ryabov'a teşekkür ederiz.

EDIT: Ben sadece bunu İşleme komut dosyaları havuzuna almak için bir çekme isteği gönderiyorum.

##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()

Kusursuz çalışır, parlak şeyler! Arsız istek, ancak etiketi TOK'daki değerleri gösterecek şekilde güncelleme şansı var mı? Nedense onları göstermiyor.
Ed Rollason

Tamamlandı - senaryoyu düzenledi
Andy Harfoot

Çok teşekkürler! Btw 3.0'da böyle bir oluşturucunun olması için bazı özellik açıklamalarını bir araya getiriyorum: docs.google.com/document/d/… Herkes, kontrol etmek / yorum yapmak / değiştirmek için çekinmeyin. Herhangi bir geçici çözüm / komut dosyası kullanarak, ayrık
rasterleri kolayca stilize

4

Bunu deneyebilirsiniz:

1) Katman özelliklerinde basit bir stil oluşturun, ardından kaydet düğmesini kullanarak dışa aktarma dosyasına kaydedin. Bunlar şu şekildedir:

değer, R, G, B, Alfa, etiket

2) İşlem modülünün çim (6 veya 7) araç kutusunda r.category kullanın. Bu, tarama değerlerinin bir listesini sağlamalıdır. Bu değerleri kopyalayın. Sürekli veriler için r.quantile komutunu kullanabilirsiniz.

3) Daha önce kaydettiğiniz dışa aktarma dosyasını bir metin düzenleyicisinde açın (örn. Pencerelerde notepad ++, linux'da tercih edilen yükler). Değerleri yapıştırın ve uygun şekilde yeniden biçimlendirin.

@Stephane

3a) Ayrık değerler için, alfa değerini 0 olarak ayarlayabilir veya kategori dosyasında görüntülemek istemediğiniz verileri silebilir veya yorum yapabilirsiniz (satırın başında # kullanarak).

3b) Sürekli değerler için başlangıç ​​değeri için bir satır ve bitiş değeri için başka bir satır oluşturun. Her ikisi için de alfa değerini 0 olarak ayarlayın.

4) Örneğin, üç dosya oluşturduğunuzu varsayalım:

category.txt - r.category çıktısı, kopyala ve yapıştır, üstte iki boş satır ekleyin. Toplam uzunluk 1 sütun. Benzersiz değerlerin sayısını kontrol edin ve QGIS'de aynı sayıda girişe sahip bir stil oluşturun.

colours.txt - istediğiniz renkleri içeren bir QGIS Oluşturulmuş Renk Haritası Dışa Aktarma Dosyası. Toplam uzunluk 6 sütun.

labels.txt - istediğiniz etiketleri içeren dosyaya, üstüne iki boş satır ekleyin. Toplam uzunluk 1 sütun.

Dosyaları birleştirmek ve csv olarak kaydetmek için bir e-tablo kullanın. Bunu QGIS'de açın.

Alternatif olarak, komut satırında (bash veya msys):

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

Ayrıca bakınız:

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

Raster veriler için gelişmiş renk paleti


Çok güzel bir yöntem! Ama yine de,
rasterimde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.