使用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

Answers:


8

您可以创建一个自定义的样式方案,例如唯一类别,但是您必须手动添加所有类别(必须使用Atleast,但是我使用的是旧版QGIS)。

右键单击栅格->属性->样式。在其中选择singleband pseudocolor作为,Render type然后单击红色小加号以添加您自己的值和相应的颜色。类似于以下内容: 在此处输入图片说明

请注意,您也可以使用分类来自动获取值,但是如果您有离散值,最好手动添加它们,这取决于数据的分布方式。

如果您的数据遵循模式,如果它是0,1,2 .... 10,则可以将设置Mode为相等的间隔,定义范围Min:0Max:10然后Classes:11单击Classify,您将自动获得所有值。然后,您可以根据需要更改它们。 在此处输入图片说明 我知道这并不完美,但这是迄今为止我发现的最好的。可能有一个可解决此问题的插件。


我希望能够自动检索离散栅格的所有可能值,但是显然(目前还不存在)。谢谢!
斯特凡·亨里奥德

据我所知,这还不可能,但是可能有一个插件可以做到这一点。
哈桑·穆斯塔法

@Stéph,用于自动获取值的整个范围:在“加载最小/最大值”下,您可以选择“最小/最大”,然后单击“加载”,然后设置可覆盖该范围的类数(根据Hasan的说明),然后点击“分类”。如果您缺少该范围内的值,则需要手动将其删除。
Simbamangu '16

2
谢谢,这确实是我使用的解决方法。但是我觉得它不是很直观,主要是当我向新用户教授Qgis时。此外,如果我不想在栅格上显示值“ 6”,那么我有一个问题:所有具有“ 6”的像素都将押注在“ 5”和“ 7”之间的颜色。我当然可以说“ 6”应被视为NoData,或者我可以使用栅格计算器来创建不带“ 6”的新栅格,但是同样,所有这些都是解决方法。理想情况下,我希望有一个按钮“检索所有单个值”。我会检查它是否计划在未来的版本...
斯特凡Henriod

1
我已经创建了一个有关相关问题的票证:hub.qgis.org/issues/14449
Kurt Menke

5

这是一个快速且肮脏的Processing脚本,它完全满足您的要求(为颜色选择致歉!)。将其放在“处理脚本”目录中(例如C:\ Users \ .qgis2 \ processing \ scripts),它将显示在“处理”工具箱中的“脚本”>“栅格”下。

将其基于的Unique_values_count.py脚本归功于Yury Ryabov。

编辑:我只是提交一个拉取请求,以使其进入处理脚本存储库。

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

完美无瑕的作品!厚脸皮的要求,但是否有机会更新标签,以便在目录中显示值?由于某些原因,它没有显示出来。
Ed Rollason

完成-刚刚编辑了脚本
Andy Harfoot

非常感谢!顺便说一句,我正在整理一些功能说明,以使3.0中包含这样的渲染器:docs.google.com/document/d / ... 任何人,请随时检查/评论/修改。这将是巨大的,能够轻松的风格离散栅格使用任何解决方法/脚本...
斯特凡Henriod

4

您可以尝试以下方法:

1)在“图层”属性中创建一个简单样式,然后使用“保存”按钮将其保存到导出文件中。这些形式为:

值,R,G,B,Alpha,标签

2)在处理模块的草(6或7)工具箱中使用r.category。这应该提供栅格值的列表。复制这些值。您可以将r.quantile用于连续数据。

3)在文本编辑器中打开您之前保存的导出文件(例如Windows上的notepad ++,Linux上的选择负载)。粘贴值并重新格式化以适合。

@Stephane

3a)对于离散值,可以将alpha设置为0,或者删除或注释掉任何不想在类别文件中显示的数据(在行的开头使用#)。

3b)对于连续值,请为起始值创建一行,并为结束值创建另一行。将两者的alpha都设置为0。

4)例如,假设您创建了三个文件:

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

用于栅格数据的高级调色板


很不错的方法!但尽管如此,如果有一些类别在我的光栅,我不想显示,我卡住了...
斯特凡Henriod
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.