Estilo de varredura discreta usando QGIS?

11

Eu tenho rasters com valores discretos (categorias Landuse, valores booleanos ...). Eu gostaria de poder estilizá-los de maneira discreta:

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

Desejo algo como as "Categorias exclusivas" no ArcGIS: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

No entanto, todas as opções que vejo envolvem rampas coloridas ... Perdi alguma coisa?


Abri uma solicitação de recurso, pois parece haver apenas soluções alternativas disponíveis, não soluções: http://hub.qgis.org/issues/14845

Stéphane Henriod
fonte

Respostas:

7

Você pode criar um esquema de estilo personalizado, algo como categorias exclusivas, mas terá que adicionar todas as categorias manualmente (pelo menos eu preciso, mas estou usando uma versão mais antiga do QGIS).

Clique com o botão direito do mouse em raster -> properties -> style. Lá, escolha singleband pseudocolorcomo Render typee clique no pequeno plus vermelho para adicionar seus próprios valores e cores correspondentes. Algo ao longo das linhas de: insira a descrição da imagem aqui

Observe que você também pode usar o classify para obter os valores automaticamente, mas se você tiver valores discretos, talvez seja melhor adicioná-los manualmente, depende de como seus dados são distribuídos.

Se os seus dados segue um padrão, se for 0,1,2 .... 10, você pode definir o Modea igual intervalo, definir o intervalo Min:0, Max:10e Classes:11, clique Classifye você terá todos os valores automaticamente. Então você pode alterá-los como achar melhor. insira a descrição da imagem aqui Eu sei que não é perfeito, mas este é o melhor que eu encontrei até agora. Pode haver um plug-in que lida com esse problema.

Hasan Mustafa
fonte
Eu esperava a possibilidade de recuperar automaticamente todos os valores possíveis da minha varredura discreta, mas aparentemente isso ainda não existe. Obrigado!
Stéphane Henriod
Tanto quanto sei, ainda não é possível, mas pode haver um plugin que faça isso.
Hasan Mustafa
@ Stéph, para obter automaticamente todo o intervalo de valores: em 'Load min / max values', você pode selecionar 'min / max' e depois clicar em 'load', depois definir o número de classes para cobrir esse intervalo (conforme as notas de Hasan ) e clique em 'classificar'. Se você tiver valores ausentes no intervalo, precisará excluí-los manualmente.
Simbamangu
2
Obrigado, essa é realmente a solução alternativa que eu uso. Mas não acho muito intuitivo, principalmente quando ensino Qgis para novos usuários. Além disso, se eu tiver um valor "6" que não quero exibir na minha varredura, tenho um problema: todos os pixels com "6" apostarão uma cor interpolada entre "5" e "7". É claro que posso dizer que "6" deve ser considerado como NoData ou posso usar a calculadora de varredura para criar uma nova varredura sem "6", mas, novamente, essas são todas as soluções alternativas. Idealmente, eu desejaria um botão "Recuperar todos os valores únicos". Vou verificar se ele está planejado para versões futuras ...
Stéphane Henriod
1
Eu criei um bilhete sobre uma questão relacionada: hub.qgis.org/issues/14449
Kurt Menke
5

Aqui está um script de processamento rápido e sujo que faz exatamente o que você está pedindo (desculpas pelas opções de cores!). Coloque-o no diretório de scripts de processamento (por exemplo, C: \ Users \ .qgis2 \ processing \ scripts) e ele será exibido na caixa de ferramentas de processamento em Scripts> Raster.

Agradecemos a Yury Ryabov pelo script Unique_values_count.py no qual isso se baseia.

EDIT: Estou apenas enviando uma solicitação pull para obter isso no repositório de scripts de processamento.

##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
fonte
Isso funciona perfeitamente, coisas brilhantes! Solicitação atrevida, mas alguma chance de atualizar o rótulo para que ele mostre os valores no sumário? Por alguma razão, não está mostrando a eles.
precisa saber é o seguinte
Feito - acabou de editar o script
Andy Harfoot
Muito obrigado! No entanto, estou reunindo algumas descrições de recursos para incluir esse renderizador no 3.0: docs.google.com/document/d/… Qualquer pessoa, fique à vontade para verificar / comentar / modificar. Seria ótimo para ser capaz de rasters discretos facilmente estilo com o uso de qualquer solução alternativa / scripting, ...
Stéphane Henriod
4

Você pode tentar o seguinte:

1) Crie um estilo simples nas propriedades da camada e salve-o em um arquivo de exportação usando o botão Salvar. Estes estão na forma:

valor, R, G, B, Alfa, etiqueta

2) Use r.category na caixa de ferramentas grama (6 ou 7) do módulo de processamento. Isso deve fornecer uma lista de valores de varredura. Copie esses valores. Você pode usar r.quantile para dados contínuos.

3) Abra o arquivo de exportação que você salvou anteriormente em um editor de texto (por exemplo, o bloco de notas ++ no Windows, muitas opções de escolha no linux). Cole os valores e reformate para se adequar.

@Stephane

3a) Para valores discretos, você pode definir o alfa como 0 ou excluir ou comentar (usando # no início da linha) todos os dados que não deseja exibir no arquivo de categoria.

3b) Para valores contínuos, crie uma linha para o valor inicial e outra para o valor final. Defina o alfa para ambos como 0.

4) Por exemplo, suponha que você criou três arquivos:

categories.txt - saída de r.category, copie e cole, adicione duas linhas em branco na parte superior. Comprimento total 1 coluna. Verifique o número de valores exclusivos e faça um estilo com o mesmo número de entradas no QGIS.

colours.txt - um arquivo de exportação de mapa de cores gerado pelo QGIS com as cores que você desejar. Comprimento total 6 colunas.

labels.txt - arquivo com os rótulos desejados, adicione duas linhas em branco na parte superior. Comprimento total 1 coluna.

Use uma planilha para mesclar os arquivos e salvar como um CSV. Abra isso no QGIS.

Como alternativa, na linha de comando (bash ou msys):

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

Veja também:

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

Paleta de cores avançada para dados rasterizados

vinh
fonte
Método muito bom! Mas ainda assim, se existem algumas categorias em minha raster que eu não quero exibição, eu estou preso ...
Stéphane Henriod