중요

번역은 여러분이 참여할 수 있는 커뮤니티 활동입니다. 이 페이지는 현재 100.00% 번역되었습니다.

5. 래스터 레이어 사용하기

힌트

PyQGIS 콘솔을 사용하지 않는 경우 이 페이지에 있는 코드 조각들을 다음과 같이 가져와야 합니다:

 1from qgis.core import (
 2    QgsRasterLayer,
 3    QgsProject,
 4    QgsPointXY,
 5    QgsRaster,
 6    QgsRasterShader,
 7    QgsColorRampShader,
 8    QgsSingleBandPseudoColorRenderer,
 9    QgsSingleBandColorDataRenderer,
10    QgsSingleBandGrayRenderer,
11)
12
13from qgis.PyQt.QtGui import (
14    QColor,
15)

5.1. 레이어 상세 정보

래스터 레이어는 하나 또는 그 이상의 래스터 밴드로 이루어져 있습니다 — 이를 단일 밴드 그리고 다중 밴드 래스터라고 합니다. 밴드 하나는 값들의 행렬을 표현합니다. 컬러 이미지(예: 항공 사진)는 적색, 청색, 녹색 밴드로 이루어진 래스터입니다. 단일 밴드 래스터는 일반적으로 연속적인 변수들(예: 표고) 또는 불연속적인 변수들(예: 토지 이용도) 가운데 하나를 표현합니다. 또는 래스터 레이어에 색상표가 첨부되어 래스터 값들이 색상표에 저장된 색상들을 참조하는 경우도 있습니다.

다음 코드는 rlayerQgsRasterLayer 클래스 객체라고 가정합니다.

rlayer = QgsProject.instance().mapLayersByName('srtm')[0]
# get the resolution of the raster in layer unit
print(rlayer.width(), rlayer.height())
919 619
# get the extent of the layer as QgsRectangle
print(rlayer.extent())
<QgsRectangle: 20.06856808199999875 -34.27001076999999896, 20.83945284300000012 -33.75077500700000144>
# get the extent of the layer as Strings
print(rlayer.extent().toString())
20.0685680819999988,-34.2700107699999990 : 20.8394528430000001,-33.7507750070000014
# get the raster type: 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband
print(rlayer.rasterType())
RasterLayerType.GrayOrUndefined
 # get the total band count of the raster
print(rlayer.bandCount())
1
# get the first band name of the raster
print(rlayer.bandName(1))
Band 1: Height
# get all the available metadata as a QgsLayerMetadata object
print(rlayer.metadata())
<qgis._core.QgsLayerMetadata object at 0x13711d558>

5.2. 렌더링 작업자

래스터 레이어를 불러왔을 때, 그 유형을 기반으로 기본 렌더링 작업자가 할당됩니다. 레이어 속성에서 또는 프로그래밍 방식으로 렌더랑 작업자를 변경할 수 있습니다.

현재 렌더링 작업자를 쿼리하려면:

print(rlayer.renderer())
<qgis._core.QgsSingleBandGrayRenderer object at 0x7f471c1da8a0>
print(rlayer.renderer().type())
singlebandgray

렌더링 작업자를 설정하려면 QgsRasterLayer 클래스의 setRenderer() 메소드를 사용하십시오. (QgsRasterRenderer 클래스에서 파생된) 렌더링 작업자 클래스가 여러 개 있습니다:

단일 밴드 래스터는 회색조(낮은 값은 검정색, 높은 값은 흰색) 또는 값에 색상을 할당하는 의사 색상(pseudocolor) 알고리즘 가운데 하나로 그릴 수 있습니다. 색상표를 가진 단일 밴드 래스터는 색상표를 사용해서도 그릴 수 있습니다. 다중 밴드 래스터는 일반적으로 RGB 색상에 밴드들을 매핑시켜서 그립니다. 또는 밴드 단 한 개만 사용해서 그릴 수도 있습니다.

5.2.1. 단일 밴드 래스터

단일 밴드 래스터 레이어를 (0에서 255까지의 픽셀 값들에 대응하는) 초록색에서 노란색 범위의 색상을 사용해서 렌더링하려 한다고 해봅시다. 첫 번째 단계는 QgsRasterShader 클래스 객체를 준비해서 그 셰이더(shader) 함수를 환경설정하는 것입니다:

1fcn = QgsColorRampShader()
2fcn.setColorRampType(QgsColorRampShader.Interpolated)
3lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)),
4      QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
5fcn.setColorRampItemList(lst)
6shader = QgsRasterShader()
7shader.setRasterShaderFunction(fcn)

셰이더는 자체 색상표가 지정하는 대로 색상을 매핑합니다. 이 색상표가 픽셀 값들과 그 관련 색상들의 목록을 제공합니다. 세 가지 보간 모드가 있습니다:

  • 선형 (Interpolated): 픽셀 값 위아래 있는 색상표 항목들로부터 색상을 선형적으로 보간합니다.

  • 불연속 (Discrete): 픽셀 값 이상의 값을 가진 색상표 항목들 가운데 픽셀 값과 가장 가까이 있는 색상표 항목의 색상을 사용합니다.

  • 정확 (Exact): 색상을 보간하지 않고, 색상표 항목들과 동등한 값을 가진 픽셀들만 그릴 것입니다.

두 번째 단계에서는 래스터 레이어에 이 셰이더를 할당할 것입니다:

renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader)
rlayer.setRenderer(renderer)

앞의 코드에 있는 숫자 1 은 밴드 번호입니다. (래스터 밴드의 인덱스는 1부터 시작합니다.)

마지막으로 결과물을 보려면 triggerRepaint() 메소드를 사용해야 합니다:

rlayer.triggerRepaint()

5.2.2. 다중 밴드 래스터

QGIS는 컬러 이미지를 생성하기 위해 기본적으로 처음 3개의 밴드를 적색, 녹색, 청색으로 매핑합니다. (이를 MultiBandColor 그리기 스타일이라 합니다.) 그러나 이 설정을 무시하고 싶은 경우가 있을 수도 있습니다. 다음은 적색 밴드(1)와 녹색 밴드(2)를 교환하는 코드입니다:

rlayer_multi = QgsProject.instance().mapLayersByName('multiband')[0]
rlayer_multi.renderer().setGreenBand(1)
rlayer_multi.renderer().setRedBand(2)

래스터를 가시화하는 데 밴드 하나만 필요한 경우, 단일 밴드 그리기를 회색조 또는 의사 색상 가운데 하나로 선택하면 됩니다.

맵을 업데이트해서 결과물을 보려면 triggerRepaint() 메소드를 사용해야 합니다:

rlayer_multi.triggerRepaint()

5.3. 값 쿼리하기

QgsRasterDataProvider 클래스의 sample() 메소드를 사용하면 래스터 값을 쿼리할 수 있습니다. QgsPointXY 클래스와 여러분이 쿼리하려는 래스터 레이어의 밴드 번호를 지정해야 합니다. 이 메소드는 래스터 값과 쿼리 결과에 따라 True 또는 False 를 가진 투플(tuple)을 반환합니다:

val, res = rlayer.dataProvider().sample(QgsPointXY(20.50, -34), 1)

래스터 값을 쿼리할 수 있는 또다른 메소드는 QgsRasterIdentifyResult 클래스 객체를 반환하는 identify() 메소드입니다.

ident = rlayer.dataProvider().identify(QgsPointXY(20.5, -34), QgsRaster.IdentifyFormatValue)

if ident.isValid():
  print(ident.results())
{1: 323.0}

이 경우, results() 메소드가 밴드 인덱스를 키로 그리고 밴드 값을 값으로 가지는 목록(dictionary)을 반환합니다. 예를 들면 {1: 323.0} 같은 식으로 말이죠.

5.4. 래스터 데이터 편집하기

QgsRasterBlock 클래스를 사용하면 래스터 레이어를 생성할 수 있습니다. 예를 들어 픽셀 당 1바이트를 가진 2x2 래스터 블록을 생성하려면:

block = QgsRasterBlock(Qgis.Byte, 2, 2)
block.setData(b'\xaa\xbb\xcc\xdd')

writeBlock() 메소드 덕분에 래스터 픽셀을 덮어쓸 수 있습니다. 2x2 블록의 0,0 위치에 있는 기존 래스터 데이터를 덮어쓰려면:

provider = rlayer.dataProvider()
provider.setEditable(True)
provider.writeBlock(block, 1, 0, 0)
provider.setEditable(False)