REMOTE SENSING

PyQGIS 3.7: 파이썬 콘솔에서 GDAL 래스터 계산기 구동하기

유병혁 2019. 4. 23. 06:31

안녕하세요? 이번 글은 파이썬 콘솔에서 GDAL 래스터 계산기를 구동해 보도록 하겠습니다.

QGIS 파이썬 환경을 PyQGIS라고 하는데요, 상단 메뉴에서 '플러그인 > 파이썬 콘솔'을 실행하시면 됩니다.


파이썬 콘솔 창은 아래와 같습니다.


파이썬 콘솔에서 다음과 같이 입력하면 파이썬 버전을 확인할 수 있는데요, QGIS 3.4는 파이썬 3.7.0을 쓰고 있습니다.

1
2
import sys
print(sys.version)
cs


GDAL 래스터 계산기는 공간처리 툴박스의 'GDAL > 래스터 계산기'에 위치해 있습니다.


GDAL 래스터 계산기 창은 아래와 같습니다. 이 창의 각 파라미터를 파이썬 콘솔에서 제어해 주시면 되겠습니다.


실습을 위해 소백산국립공원 비로봉 주목군락지 일대의 무인기 영상을 하나 추가했습니다.


참고로, 다음 구문을 입력하시면 GDAL 래스터 계산기 구동을 위한 도움말을 얻으실 수 있습니다.

1
processing.algorithmHelp('gdal:rastercalculator')
cs


먼저, 입력 레이어(input layer)를 지정해 줍니다. 여기서는 무인기 영상을 지정해주면 되겠죠?!

1
2
3
import os
os.chdir('D:\GEODATA')
input_layer = QgsRasterLayer('odm_orthophoto.tif''raster')
cs


입력 레이어는 다수의 래스터 밴드로 구성되어 있습니다. RGB 무인기 영상은 4개 밴드로 구성되어 있는데요,

래스터 계산기의 변수 A에 대한 래스터 밴드 번호를 지정해 줍니다. 여기서는 밴드 1 (Red)로 지정해 주겠습니다.

1
parameters = {'INPUT_A': input_layer, 'BAND_A'1,
cs


여기서는 변수 A부터 C까지 각각 무인기 영상의 1번(Red), 2번(Green), 3번 밴드(Blue)로 지정해 주었습니다.

실제 래스터 계산기에서는 다수의 입력 레이어를 사용할 수 있으며 변수는 A부터 F까지 선언하실 수 있습니다.

1
2
3
parameters = {'INPUT_A': input_layer, 'BAND_A'1,
        'INPUT_B': input_layer, 'BAND_B'2,
        'INPUT_C': input_layer, 'BAND_C'3,
cs


다음은 래스터 계산식인데요, 저는 무인기 영상의 초과녹색지수(Excess Green Index: ExG)를 계산해 봤습니다.

1
        'FORMULA''2 * (B/(A+B+C)) - (A/(A+B+C)) - (C/(A+B+C))',
cs


다음은 산출물의 NODATA 값 설정인데요, 0으로 지정해 주겠습니다.

1
        'NO_DATA'0,
cs


출력 래스터 형식은 콤보박스에서 원하는 유형을 지정해 주시면 됩니다.


아래와 같이 다양한데요,


각각의 파라미터 유형을 어떻게 지정할 지는 도움말을 참조하시면 되겠습니다. 저는 Float32를 선택했습니다.

1
        'RTYPE'5,
cs



이제 래스터 계산기 결과값이 저장될 파일을 선언해 주시면 되겠습니다. 결과를 확인해 볼까요?!

1
        'OUTPUT' : 'ExG.tif'}
cs


지금까지 작성된 아래 코드를 파이썬 콘솔에 입력하시면 자동 실행됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
print(sys.version)
 
processing.algorithmHelp('gdal:rastercalculator')
 
import os
os.chdir('D:\GEODATA')
input_layer = QgsRasterLayer('odm_orthophoto.tif''raster')
 
parameters = {'INPUT_A': input_layer, 'BAND_A'1,
        'INPUT_B': input_layer, 'BAND_B'2,
        'INPUT_C': input_layer, 'BAND_C'3,
        'FORMULA''2 * (B/(A+B+C)) - (A/(A+B+C)) - (C/(A+B+C))',
        'NO_DATA'0,
        'RTYPE'5,
        'OUTPUT' : 'ExG.tif'}
processing.runAndLoadResults('gdal:rastercalculator', parameters)
cs


아래와 같이 결과값이 자동적으로 레이어 추가되었습니다.


무인기 영상 내 고사목 영역을 확대해서 ExG 결과값을 확인해 보겠습니다.


고사목이나 시들음이 주변과 뚜렷히 대비된 효과를 확인할 수 있는데요, 값이 뭔가 이상합니다. 왜 그럴까요?!


확인해 보니 제가 사용한 무인기 영상이 Byte이기 때문인데요, 입력 레이어의 포맷 변경은 공간처리

툴박스에서 '래스터 변환 > 변환 (포맷 변경)'을 이용하시면 됩니다. ※ 간단한 내용이라 본 글에서 생략합니다.