안녕하세요? 이번 글은 Google Earth Engine에서 반복문으로 연도별 NPP(2001-2023)를 저장해 보겠습니다. 앞서 작성한 아래 2개 글 내용에 삽입된 코드를 응용했다고 보시면 되겠습니다.
import ee
import geemap
import time
# Earth Engine 인증
ee.Authenticate()
# Earth Engine 초기화
ee.Initialize(project='ee-foss4g')
먼저, region이라는 이름의 경계상자를 정의했다고 가정하겠습니다. 우리는 2001년부터 2023년까지 순차적으로 연도별 NPP를 호출한 후, region 크기로 잘라내서 Google Drive로 내보낼 것입니다. 이를 위해 반복문을 사용하고 각 반복마다 래스터 파일을 생성하려고 합니다.
여기서는 일본 경계상자를 region으로 정의했고 좌표계는 EPSG:2454로 설정했습니다. 연도 리스트는 다음과 같이 정의해서 years라는 변수로부터 2001부터 2023까지 반복하려고 합니다.
crs = ee.Projection('EPSG:2454')
# 연도 리스트 생성
years = list(range(2001, 2024))
아래 코드는 각 연도에 대해 NPP 값을 계산하고 해당 이미지를 Google Drive로 내보내는 과정을 반복합니다. 스케일링, 해상도, 좌표계 등이 설정된 것을 확인하실 수 있고, 60초마다 진행상황을 확인할 수 있도록 설정했습니다.
# 각 연도에 대해 NPP 값을 계산
for year in years:
dataset = (
ee.ImageCollection('MODIS/061/MOD17A3HGF')
.filterDate(f"{year}-01-01", f"{year}-12-31")
.filterBounds(region)
)
# 첫 번째 이미지를 선택하고 필요한 연산 수행
npp = dataset.select('Npp').first().multiply(0.0001)
# 이미지를 Google Drive에 내보내기
task = ee.batch.Export.image.toDrive(
image=npp,
description=f"NPP_{year}",
folder='export',
scale=500, # 이미지의 해상도
crs=crs,
region=region, # 내보낼 영역
maxPixels=1e13,
fileFormat='GeoTIFF'
)
# 내보내기 작업 시작
task.start()
# 내보내기 작업 상태 확인
print('Export task started. Checking status...')
while True:
status = task.status()
state = status['state']
print('Polling for task (id: {}). Status: {}'.format(task.id, state))
if state in ['COMPLETED', 'FAILED']:
break
time.sleep(60) # 60초 간격으로 상태 확인
# 완료 후 상태 출력
print('Task completed. Final status:')
print(status)
이제 각 연도별 이미지가 출력됩니다.
이미지를 다운받아서 QGIS에서 시각화한 결과입니다. 행정경계는 GADM에서 다운받으실 수 있습니다.
참고로 QGIS에서는 구역 통계를 통해 NPP 픽셀 값의 합계를 계산할 수 있습니다.
아래와 같이 NPP_sum이 계산되었는데요, 해당 값의 단위는 kg*C/m^2이므로 NPP_sum * 250000 * 0.001 식에 따라 Mg으로 변환 처리하겠습니다.
필드 계산기를 열고, 해당 식을 적용하여 NPP의 Mg 수치를 변환할 수 있습니다.