REMOTE SENSING

PyQGIS: MODIS 식생지수(EVI) 여러 장 한번에 처리하기

유병혁 2021. 2. 3. 21:47

안녕하세요? 앞서 QGIS 파이썬 콘솔(PyQGIS)을 통해 MODIS 식생지수 EVI 한장을 처리했었는데요, 이번에는 여러 장을 한번에 처리하는 과정을 정리해 보겠습니다. 아래 2개 글의 과정을 여러 장에 반복적으로 적용해서 업무를 자동화하는 내용입니다.

 

1. PyQGIS: MODIS 식생지수(EVI) 데이터의 좌표계 변환 후 저장

2. PyQGIS: MODIS 식생지수(EVI) 데이터에 비례인자 적용 후 저장

 

여러 장의 MODIS 데이터는 스크립트를 통해 내려받으실 수 있는데요, 다음 링크 글에서 스크립트 사용법과 파일 다운로드까지 정리되어 있습니다(작성 글 마지막 단락에 파일 다운로드 링크).

 

스크립트를 이용한 MODIS 데이터 다운로드 방법 소개

안녕하세요? 이번 글은 MODIS 데이터를 스크립트로 다운로드하는 방법을 정리해 보겠습니다. 이전 글은 아래 링크를 참조하시면 됩니다. MODIS 식생지수 (MOD13Q1) 데이터 다운로드 방법 소개 안녕하

blog.daum.net

이번 글에서 작성할 코드는 파일을 내려받으시면 됩니다. 자, 그럼 파일과 코드가 준비되었으니 시작해볼까요?!

PYQGIS_MODIS_EVI_PA.py
0.00MB

 

osgeokr/GGRS

Contribute to osgeokr/GGRS development by creating an account on GitHub.

github.com

현재 제 컴퓨터에는 'D:\GEODATA' 폴더 내에는 아래와 같이 파일들이 위치하고 있습니다. 

inputRaster 폴더 내에는 아래와 같이 MODIS *.hdf 파일 20장이 위치하고 있습니다.

이걸 처리한 결과값을 outputRaster 폴더에 담고자 합니다. QGIS를 실행해 볼까요?!

QGIS에서 '플러그인 > 파이썬 콘솔'을 실행합니다.

파이썬 콘솔 패널에서 '편집기 보이기' 버튼을 클릭합니다.

아래와 같이 파이썬 콘솔 패널의 좌, 우측이 구분되는데요,

'스크립트 열기' 버튼을 클릭하고,

내려받은 *.py 파일을 불러옵니다. 참고로 '_PA'는 'Process Automation'의 의미로 붙였습니다.

*코드내용은 다음과 같습니다.

# 모듈 불러오기
import gdal, os
# 디렉터리 내의 모든 파일 목록
os.chdir('D:\\GEODATA\\inputRaster')
rasterFiles = os.listdir(os.getcwd())
# 여러 장 한번에 처리하기 반복
for i in range(len(rasterFiles)):
    # i번째 hdf 파일 열기
    os.chdir('D:\\GEODATA\\inputRaster')
    hdfLayer = gdal.Open(rasterFiles[i], gdal.GA_ReadOnly)
    # EVI 래스터 레이어 열기
    rLayer = gdal.Open(hdfLayer.GetSubDatasets()[1][0], gdal.GA_ReadOnly)
    # EVI 래스터 출력 위치/이름 지정
    outputName = rLayer.GetMetadata_Dict()['LOCALGRANULEID'][:-4]+'_EVI.tif'
    outputRaster = '..\\outputRaster\\'+ outputName
    # 워프(재투영)
    gdal.Warp(outputRaster, rLayer, dstSRS='EPSG:4326')
    # EVI 워프(재투영)래스터 레이어 열기
    os.chdir('D:\\GEODATA\\outputRaster')
    input_layer = QgsRasterLayer(outputName, 'raster')
    parameters = {'INPUT_A': input_layer, 'BAND_A': 1, # 래스터 밴드
        'FORMULA': 'A * 0.0001', # 래스터계산식
        'RTYPE': 5, # 출력 래스터 유형은 Float32
        'OUTPUT' : rasterFiles[i][:-4] + '_SF.tif'}
    # 래스터 계산기 실행
    processing.runAndLoadResults('gdal:rastercalculator', parameters)

 

이제 해당 코드가 추가되었는데요,

'스크립트 실행' 버튼을 클릭하면, inputRaster 폴더 내에 위치한 *.hdf 파일에 반복적으로 작업이 수행됩니다.

실행 결과는 다음과 같습니다. 이제 여러 장을 한번에 처리할 수 있겠죠?!