Стилизация дискретного растра с помощью QGIS?

11

У меня есть растры с дискретными значениями (категории Landuse, логические значения ...). Я хотел бы иметь возможность стилизовать их по-разному:

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

Я хотел бы что-то вроде «Уникальных категорий» в ArcGIS: http://resources.arcgis.com/en/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

Тем не менее, все варианты, которые я вижу, включают цветовые схемы ... Я что-то пропустил?


Я открыл запрос функции, так как, кажется, доступны только обходные пути, а не решения: http://hub.qgis.org/issues/14845

Стефан Генриод
источник

Ответы:

8

Вы можете создать индивидуальную схему стилей, что-то вроде уникальных категорий, но вам придется добавить все категории вручную (по крайней мере, мне нужно, но я использую старую версию QGIS).

Щелкните правой кнопкой мыши растр -> свойства -> стиль. Там выберите singleband pseudocolorкак Render typeи нажмите на маленький красный плюс, чтобы добавить свои собственные значения и соответствующие цвета. Что-то вроде: введите описание изображения здесь

Обратите внимание, что вы также можете использовать классификацию для автоматического получения значений, но если у вас есть дискретные значения, вам может быть лучше просто добавить их вручную, в зависимости от того, как распределяются ваши данные.

Если данные следует образцу, если это 0,1,2 .... 10, можно установить Modeравный интервал, определяет диапазон Min:0, Max:10и Classes:11нажмите кнопку , Classifyи вы получите все значения автоматически. Тогда вы можете изменить их, как считаете нужным. введите описание изображения здесь Я знаю, что это не идеально, но это лучшее, что я нашел до сих пор. Там может быть плагин, который занимается этой проблемой.

Хасан Мустафа
источник
Я надеялся на возможность автоматического получения всех возможных значений моего дискретного растра, но, видимо, этого (пока?) Не существует. Благодаря!
Стефан Генриод
Насколько я знаю, это пока невозможно, но может быть плагин, который делает это.
Хасан Мустафа
@ Stéph, для автоматического получения всего диапазона значений: в «Load min / max values» вы можете выбрать «min / max» и затем нажать «load», а затем установить количество классов для охвата этого диапазона (согласно примечаниям Хасана). ) и нажмите «классифицировать». Если в диапазоне отсутствуют значения, вам необходимо удалить их вручную.
Симбамангу
2
Спасибо, это действительно обходной путь, который я использую. Но я не нахожу это очень интуитивным, главным образом, когда я преподаю Qgis новым пользователям. Более того, если у меня есть значение «6», которое я не хочу отображать в своем растре, у меня есть проблема: все пиксели с «6» будут ставить цвет, интерполированный между «5» и «7». Конечно, я могу сказать, что «6» следует рассматривать как NoData, или я могу использовать калькулятор растра для создания нового растра без «6», но, опять же, это все обходные пути. В идеале я бы хотел кнопку «Получить все отдельные значения». Я проверю, запланировано ли это для будущих версий ...
Стефан Генриод
1
Я создал заявку
Курт Менке
5

Вот быстрый и грязный скрипт обработки, который делает именно то, что вы просите (извините за выбор цвета!). Поместите его в каталог скриптов обработки (например, C: \ Users \ .qgis2 \ processing \ scripts), и он отобразится в наборе инструментов обработки в разделе Сценарии> Растр.

Благодарим Юрия Рябова за сценарий Unique_values_count.py, на котором он основан.

РЕДАКТИРОВАТЬ: я просто отправляю запрос на получение, чтобы получить это в хранилище скриптов обработки.

##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()
Энди Харфут
источник
Это работает безупречно, блестящие вещи! Нахальный запрос, но есть ли шанс обновить метку, чтобы она показывала значения в оглавлении? По некоторым причинам это не показывает их.
Эд
Готово - только что отредактировал скрипт
Энди Харфут
Большое спасибо! Кстати, я собираю описание некоторых функций для включения такого рендерера в 3.0: docs.google.com/document/d/… Любой, не стесняйтесь проверять / комментировать / изменять. Было бы здорово иметь возможность легко
стилизовать
4

Вы можете попробовать это:

1) Создайте простой стиль в свойствах слоя, затем сохраните его в файле экспорта с помощью кнопки сохранения. Это в форме:

значение, R, G, B, альфа, метка

2) Используйте r.category в наборе инструментов Grass (6 или 7) модуля обработки. Это должно обеспечить список растровых значений. Скопируйте эти значения. Вы можете использовать r.quantile для непрерывных данных.

3) Откройте файл экспорта, который вы сохранили ранее, в текстовом редакторе (например, notepad ++ в Windows, множество вариантов загрузки в Linux). Вставьте значения и переформатируйте в соответствии с требованиями.

@Stephane

3a) Для дискретных значений вы можете установить альфа на 0, или удалить или закомментировать (используя # в начале строки) любые данные, которые вы не хотите отображать в файле категории.

3b) Для непрерывных значений создайте строку для начального значения, а другую - для конечного значения. Установите альфа для обоих на 0.

4) Например, скажем, вы создали три файла:

Categories.txt - вывод r.category, копирование и вставка, добавление двух пустых строк вверху. Общая длина 1 столбец. Проверьте количество уникальных значений и создайте стиль с таким же количеством записей в QGIS.

colours.txt - файл экспорта созданной QGIS карты цветов с понравившимися цветами. Общая длина 6 колонн.

label.txt - файл с нужными метками, добавьте две пустые строки вверху. Общая длина 1 столбец.

Используйте электронную таблицу, чтобы объединить файлы и сохранить как CSV. Откройте это в QGIS.

В качестве альтернативы, в командной строке (bash или msys):

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

Смотрите также:

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

Расширенная цветовая палитра для растровых данных

Винь
источник
Очень хороший метод! Но, тем не менее, если в моем растре есть какие-то категории, которые я не хочу отображать, я застрял ...
Стефан Генриод