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

고유 한 범주와 같은 사용자 정의 스타일 구성표를 만들 수 있지만 모든 범주를 수동으로 추가해야합니다 (Atleast,하지만 이전 버전의 QGIS 사용).

래스터-> 속성-> 스타일을 마우스 오른쪽 버튼으로 클릭하십시오. 이 선택에서 singleband pseudocolor는 AS Render type플러스 작은 빨간 클릭 자신의 가치와 해당 색상을 추가 할 수 있습니다. 다음과 같은 내용이 있습니다. 여기에 이미지 설명을 입력하십시오

classify를 사용하여 값을 자동으로 가져올 수도 있지만 이산 값이있는 경우 수동으로 값을 추가하는 것이 더 나을 수 있습니다. 데이터 배포 방법에 따라 다릅니다.

이 0,1,2 .... 10 인 경우 데이터는, 패턴을 따르는 경우를 설정할 수 Mode, 동일한 간격의 범위를 정의 Min:0, Max:10그리고 Classes:11클릭 Classify하면 자동으로 모든 값을 얻을 수 있습니다. 그런 다음 적합하다고 생각되는대로 변경할 수 있습니다. 여기에 이미지 설명을 입력하십시오 나는 그것이 완벽하지 않다는 것을 알고 있지만, 이것은 내가 지금까지 찾은 최고입니다. 이 문제를 해결하는 플러그인이있을 수 있습니다.


나는 이산 래스터의 가능한 모든 값을 자동으로 검색 할 수 있기를 희망했지만 분명히 존재하지는 않습니다. 감사!
Stéphane Henriod

내가 아는 한 아직 불가능하지만이를 수행하는 플러그인이있을 수 있습니다.
Hasan Mustafa

전체 값 범위를 자동으로 가져 오는 @ Stéph : '최소 / 최대 값로드'에서 '최소 / 최대'를 선택한 다음 '로드'를 클릭 한 다음 해당 범위를 포괄 할 클래스 수를 설정합니다 (Hasan의 설명에 따라) )를 클릭하고 '분류'를 클릭하십시오. 범위에 누락 된 값이 있으면 수동으로 삭제해야합니다.
Simbamangu

2
감사합니다. 실제로 사용하는 해결 방법입니다. 그러나 Qgis를 새로운 사용자에게 가르 칠 때 대부분 직관적이지 않습니다. 또한, 래스터에 표시하고 싶지 않은 값 "6"이 있으면 문제가 있습니다. "6"을 가진 모든 픽셀은 "5"와 "7"사이에 보간 된 색상을 내기합니다. 물론 "6"을 NoData로 간주해야한다고 말하거나 래스터 계산기를 사용하여 "6"없이 새 래스터를 만들 수 있지만 다시 말하면 모두 해결 방법입니다. 이상적으로는 "모든 단일 값 검색"단추를 원합니다. 향후 버전을 계획하고 있는지 확인해 보겠습니다.
Stéphane Henriod

1
관련된 문제에 대한 티켓을 만들었습니다 : hub.qgis.org/issues/14449
Kurt Menke

5

여기에 원하는 것을 정확하게 수행하는 빠르고 더러운 처리 스크립트가 있습니다 (색상 선택에 대한 사과!). 처리 스크립트 디렉토리 (예 : 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()

그것은 완벽하게 훌륭하게 작동합니다! 건방진 요청하지만 TOC의 값을 표시하도록 레이블을 업데이트 할 수 있습니까? 어떤 이유로 든 표시되지 않습니다.
Ed Rollason

완료-방금 스크립트를 편집 함
Andy Harfoot

고마워요! Btw 3.0에 포함 된 렌더러를 포함하는 기능 설명을 함께 정리하고 있습니다. docs.google.com/document/d/… 누구나 자유롭게 확인 / 댓글 / 수정하십시오. 해결 방법 / 스크립트를 사용하여 개별 래스터를 쉽게 스타일링 할 수 있다면 좋을 것입니다.
Stéphane Henriod

4

당신은 이것을 시도 할 수 있습니다 :

1) 레이어 속성에서 간단한 스타일을 만든 다음 저장 버튼을 사용하여 내보내기 파일로 저장합니다. 이들은 다음과 같은 형태입니다.

값, R, G, B, 알파, 라벨

2) 처리 모듈의 잔디 (6 또는 7) 도구 상자에서 r.category를 사용하십시오. 래스터 값 목록을 제공해야합니다. 이 값을 복사하십시오. 연속 데이터에 r.quantile을 사용할 수 있습니다.

3) 텍스트 편집기에서 이전에 저장 한 내보내기 파일을 엽니 다 (예 : Windows의 경우 메모장 ++, Linux의 경우 선택한 항목). 값을 붙여넣고 형식을 다시 지정하십시오.

@ 스테판

3a) 이산 값의 경우 알파를 0으로 설정하거나 범주 파일에 표시하지 않으려는 데이터를 삭제하거나 주석 처리 할 수 ​​있습니다 (줄의 시작 부분에 # 사용).

3b) 연속 값의 경우 시작 값에 대한 행과 끝 값에 대한 행을 작성하십시오. 둘 다의 알파를 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/

래스터 데이터를위한 고급 컬러 팔레트


아주 좋은 방법! 그러나 그래도 표시하고 싶지 않은 래스터에 몇 가지 범주가 있다면
멈춰
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.