Стилізація дискретного растра за допомогою 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/isissue/14845

Відповіді:


8

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

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

Зауважте, що ви також можете використовувати класифікацію для автоматичного отримання значень, але якщо у вас є дискретні значення, вам може бути краще просто додати їх вручну, залежить від способу розподілу ваших даних.

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


Я сподівався на можливість автоматичного отримання всіх можливих значень мого дискретного растру, але, мабуть, цього немає (поки що?). Дякую!
Стефан Генріод

Наскільки я знаю, це ще не можливо, але може бути плагін, який робить це.
Хасан Мустафа

@ Stéph, для автоматичного отримання всього діапазону значень: у розділі "Завантажити значення min / max" ви можете вибрати "min / max", а потім натиснути "load", а потім встановити кількість класів, щоб охопити цей діапазон (відповідно до приміток Хасана ) та натисніть "класифікувати". Якщо у діапазоні відсутні значення, вам потрібно буде видалити їх вручну.
Сімбамангу

2
Дякую, це справді рішення, яке я використовую. Але я не вважаю це дуже інтуїтивно зрозумілим, в основному, коли я навчаю Qgis новим користувачам. Крім того, якщо у мене є значення "6", яке я не хочу відображати на растрі, у мене є проблема: усі пікселі з "6" будуть робити ставку на колір, інтерпольований між "5" і "7". Я, звичайно, можу сказати, що "6" слід розглядати як NoData, або я можу використовувати калькулятор растра для створення нового растру без "6", але, знову ж таки, це все обхідні шляхи. В ідеалі я хотів би побажати кнопку "Вилучити всі одиничні значення". Я перевірю, чи планується це для майбутніх версій ...
Stéphane Henriod

1
Я створив квиток на відповідну проблему: hub.qgis.org/isissue/14449
Курт Менке

5

Ось швидкий і брудний сценарій обробки, який робить саме те, що ви просите (вибачення за вибір кольорів!). Помістіть його у каталог скриптів для обробки (наприклад, C: \ Users \ .qgis2 \ обробка \ скриптів), і він з’явиться в панелі інструментів Processing у розділі Scripts> Raster.

Подяка Юрію Рябову за сценарій Unique_values_count.py, на якому це базується.

EDIT: Я просто надсилаю запит на витяг, щоб перенести це у сховище скриптів для обробки.

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

Це працює бездоганно, блискучі речі! Хитрий запит, але будь-який шанс оновити етикетку, щоб вона відображала значення в TOC? Чомусь вони їх не показують.
Ед Ролласон

Готово - щойно редагував сценарій
Енді Гарфут

Дуже дякую! До речі, я збираю опис функцій, щоб такий рендерір був включений в 3.0: docs.google.com/document/d/… Будь-хто, не соромтеся перевірити / коментувати / змінювати. Було б чудово, щоб можна було легко
стилювати

4

Ви можете спробувати це:

1) Створіть простий стиль у властивостях шару, а потім збережіть його у експортному файлі за допомогою кнопки збереження. Вони є у формі:

значення, R, G, B, Альфа, мітка

2) Використовуйте r.category в трав'яному (6 або 7) панелі інструментів модуля обробки. Це має забезпечити перелік растрових значень. Скопіюйте ці значення. Ви можете використовувати r.quantile для постійних даних.

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

@Stephane

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

3b) Для безперервних значень створіть рядок для початкового значення та іншого для кінцевого значення. Встановіть альфа для обох 0.

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

категории.txt - виведіть r.category, скопіюйте та вставте, додайте два порожніх рядка вгорі. Загальна довжина 1 стовпчик. Перевірте кількість унікальних значень та створіть стиль із однаковою кількістю записів у QGIS.

colours.txt - файл експорту кольорів, створений QGIS, з потрібними вам кольорами. Загальна довжина 6 стовпців.

labels.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/

Розширена палітра кольорів для растрових даних


Дуже приємний метод! Але все ж, якщо в моєму
растрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.