¿Diseñar un raster discreto con QGIS?

11

Tengo rásteres con valores discretos (categorías de uso de la tierra, valores booleanos ...). Me gustaría poder diseñarlos de manera discreta:

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

Deseo algo como las "Categorías únicas" en ArcGIS: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

Sin embargo, todas las opciones que veo involucran rampas de color ... ¿Me he perdido algo?


He abierto una solicitud de función, ya que parece que solo hay soluciones alternativas disponibles, no soluciones: http://hub.qgis.org/issues/14845

Stéphane Henriod
fuente

Respuestas:

8

Puede crear un esquema de estilo personalizado, algo así como categorías únicas, pero tendrá que agregar todas las categorías manualmente (al menos tengo que hacerlo, pero estoy usando una versión anterior de QGIS).

Haga clic derecho en el ráster -> propiedades -> estilo. Allí elija singleband pseudocolorcomo Render typey haga clic en el pequeño plus rojo para agregar sus propios valores y colores correspondientes. Algo en la línea de: ingrese la descripción de la imagen aquí

Tenga en cuenta que también puede usar clasificar para obtener los valores automáticamente, pero si tiene valores discretos, es mejor que los agregue manualmente, depende de cómo se distribuyan sus datos.

Si los datos sigue un patrón, si es 0,1,2 .... 10, se puede ajustar la Modea intervalos iguales, definir el rango Min:0, Max:10y Classes:11, haga clic Classifyy obtendrá todos los valores de forma automática. Entonces podrías alterarlos como mejor te parezca. ingrese la descripción de la imagen aquí Sé que no es perfecto, pero esto es lo mejor que he encontrado hasta ahora. Puede haber un complemento que se ocupe de este problema.

Hasan Mustafa
fuente
Esperaba la posibilidad de recuperar automáticamente todos los valores posibles de mi raster discreto, pero aparentemente esto no existe (¿todavía?). ¡Gracias!
Stéphane Henriod
Hasta donde sé, todavía no es posible, pero puede haber un complemento que lo haga.
Hasan Mustafa
@ Stéph, para obtener automáticamente todo el rango de valores: en 'Cargar valores min / max' puede seleccionar 'min / max' y luego hacer clic en 'cargar', luego establecer el número de clases para cubrir ese rango (según las notas de Hasan ) y haga clic en 'clasificar'. Si le faltan valores en el rango, deberá eliminarlos manualmente.
Simbamangu
2
Gracias, esa es la solución que uso. Pero no me parece muy intuitivo, principalmente cuando enseño Qgis a nuevos usuarios. Además, si tengo un valor "6" que no quiero mostrar en mi ráster, tengo un problema: todos los píxeles con "6" apostarán un color interpolado entre "5" y "7". Por supuesto, puedo decir que "6" debe considerarse como NoData o puedo usar la calculadora ráster para crear un nuevo ráster sin "6", pero, de nuevo, esas son todas las soluciones. Idealmente, desearía un botón "Recuperar todos los valores individuales". Comprobaré si está previsto para futuras versiones ...
Stéphane Henriod
1
He creado un ticket sobre un tema relacionado: hub.qgis.org/issues/14449
Kurt Menke
5

Aquí hay un script de procesamiento rápido y sucio que hace exactamente lo que está pidiendo (¡disculpas por las opciones de color!). Póngalo en el directorio de secuencias de comandos de procesamiento (por ejemplo, C: \ Users \ .qgis2 \ processing \ scripts) y aparecerá en la caja de herramientas Procesamiento en Scripts> Ráster.

Gracias a Yury Ryabov por el script Unique_values_count.py en el que se basa esto.

EDITAR: solo estoy enviando una solicitud de extracción para llevar esto al repositorio de scripts de procesamiento.

##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
fuente
¡Eso funciona perfectamente, cosas brillantes! Solicitud descarada, pero ¿hay alguna posibilidad de actualizar la etiqueta para que muestre los valores en la tabla de contenido? Por alguna razón no se los muestra.
Ed Rollason
Hecho - solo
edité
¡Muchas gracias! Por cierto, estoy compilando una descripción de la función para tener un procesador de este tipo incluido en 3.0: docs.google.com/document/d/… Cualquiera, no dude en verificar / comentar / modificar. Sería genial poder
diseñar
4

Podrías probar esto:

1) Cree un estilo simple en las propiedades de capa, luego guárdelo en un archivo de exportación con el botón Guardar. Estos están en la forma:

valor, R, G, B, Alfa, etiqueta

2) Use r.category en la caja de herramientas grass (6 o 7) del módulo de procesamiento. Esto debería proporcionar una lista de valores ráster. Copia estos valores. Puede usar r.quantile para datos continuos.

3) Abra el archivo de exportación que guardó anteriormente en un editor de texto (por ejemplo, notepad ++ en Windows, muchas opciones en Linux). Pegue los valores y vuelva a formatear para adaptarlos.

@Stephane

3a) Para valores discretos, puede establecer el alfa en 0, o eliminar o comentar (usando # al comienzo de la línea) cualquier dato que no desee mostrar en el archivo de categoría.

3b) Para valores continuos, cree una fila para el valor inicial y otra para el valor final. Establezca el alfa para ambos en 0.

4) Por ejemplo, supongamos que ha creado tres archivos:

categories.txt: salida de r.category, copiar y pegar, agregue dos líneas en blanco en la parte superior. Longitud total 1 columna. Verifique el número de valores únicos y cree un estilo con el mismo número de entradas en QGIS.

colours.txt: un archivo de exportación de mapa de color generado por QGIS con los colores que desee. Longitud total 6 columnas.

labels.txt: archivo con las etiquetas que desee, agregue dos líneas en blanco en la parte superior. Longitud total 1 columna.

Use una hoja de cálculo para fusionar los archivos y guárdelos como un csv. Abre esto en QGIS.

Alternativamente, en la línea de comando (bash o msys):

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

Ver también:

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

Paleta de colores avanzada para datos ráster

vinh
fuente
Muy buen método! Pero aún así, si hay algunas categorías en mi ráster que no quiero mostrar, estoy atascado ...
Stéphane Henriod