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

回答:


7

独自のカテゴリのようなカスタマイズされたスタイルスキームを作成できますが、すべてのカテゴリを手動で追加する必要があります(少なくとも私はそうする必要がありますが、古いバージョンのQGISを使用しています)。

ラスター->プロパティ->スタイルを右クリックします。そこでは選択singleband pseudocolorRender typeし、独自の値とそれに対応する色を追加するために小さな赤いプラスをクリックしてください。以下の線に沿ったもの: ここに画像の説明を入力してください

また、classifyを使用して値を自動的に取得することもできますが、離散値がある場合は、データをどのように分散するかによって、手動で追加するほうがよい場合があることに注意してください。

それは0,1,2 .... 10であれば、あなたのデータは、パターンを次の場合は、設定することができMode、等間隔に範囲を定義しMin:0Max:10そしてClasses:11、クリックするClassifyと自動的にすべての値を取得します。その後、必要に応じて変更できます。 ここに画像の説明を入力してください 私はそれが完璧ではないことを知っていますが、これは私がこれまで見つけた中で最高です。この問題に対処するプラグインがあるかもしれません。


私は自分の離散ラスターのすべての可能な値を自動的に取得する可能性を望んでいましたが、明らかにこれは(まだ?)存在しません。ありがとう!
ステファンヘンリオ

私が知る限り、それはまだ可能ではありませんが、これを行うプラグインがあるかもしれません。
ハサンムスタファ

@Stéph、値の範囲全体を自動的に取得するため:「最小/最大値のロード」で「最小/最大」を選択し、「ロード」をクリックして、その範囲をカバーするクラスの数を設定します(Hasanのメモに従って) )、「分類」をクリックします。範囲内に欠損値がある場合は、それらを手動で削除する必要があります。
シンバマング

2
おかげで、それは実際に私が使用する回避策です。しかし、ほとんどの場合、Qgisを新しいユーザーに教えるときは、あまり直感的ではありません。さらに、ラスターに表示したくない値「6」がある場合、問題が発生します。「6」のピクセルはすべて、「5」と「7」の間に補間された色を賭けます。もちろん、「6」をNoDataと見なすか、「6」なしでラスター計算機を使用して新しいラスターを作成することもできますが、これらもすべて回避策です。理想的には、「すべての単一値を取得する」ボタンが必要です。それは、将来のバージョンのために計画されています場合、私は確認してくださいよ...
ステファンHenriod

1
関連する問題に関するチケットを作成しました:hub.qgis.org/issues/14449
Kurt Menke

5

これは、あなたが求めていることを正確に行う迅速で汚い処理スクリプトです(色の選択に謝罪!)。処理スクリプトディレクトリ(例:C:\ Users \ .qgis2 \ processing \ scripts)に配置すると、Scripts> Rasterの下のProcessingツールボックスに表示されます。

これが基づいている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()

それは完璧に機能し、素晴らしいものです!生意気なリクエストですが、目次の値が表示されるようにラベルを更新する可能性はありますか?何らかの理由で表示されていません。
エドローラソン

完了-スクリプトを編集したばかり
アンディハーフット

どうもありがとう!ところで、私は一緒に、このような3.0に含まレンダラ持っているいくつかの機能の説明入れています:docs.google.com/document/d/...の 誰もが、修正/ /コメントをチェックして自由に感じます。...任意の回避策/スクリプトを使用して簡単にスタイルの個別ラスタにできるように素晴らしいことだ
ステファンHenriod

4

これを試すことができます:

1)レイヤープロパティでシンプルなスタイルを作成し、保存ボタンを使用してエクスポートファイルに保存します。これらは次の形式です。

値、R、G、B、アルファ、ラベル

2)処理モジュールの芝生(6または7)ツールボックスでr.categoryを使用します。これにより、ラスタ値のリストが提供されます。これらの値をコピーします。連続データにr.quantileを使用できます。

3)テキストエディタで以前に保存したエクスポートファイルを開きます(たとえば、Windowsではnotepad ++、Linuxでは任意のロード)。値を貼り付けて、必要に応じて再フォーマットします。

@ステファン

3a)離散値の場合、アルファを0に設定するか、カテゴリファイルに表示したくないデータを削除またはコメントアウト(行の先頭に#を使用)できます。

3b)連続値の場合、開始値の行と終了値の行を作成します。両方のアルファを0に設定します。

4)たとえば、3つのファイルを作成したとします。

categories.txt-r.categoryの出力、コピーアンドペースト、上部に2行の空白行を追加します。全長1列。一意の値の数を確認し、QGISで同じ数のエントリでスタイルを作成します。

colours.txt-好きな色のQGIS生成カラーマップエクスポートファイル。合計6列。

labels.txt-必要なラベルを含むファイル。上部に2行の空白行を追加します。全長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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.