REMOTE SENSING

Google Earth Engine: 반복문으로 연도별 NPP(2001-2023) 저장하기

유병혁 2024. 9. 5. 00:11

안녕하세요? 이번 글은 Google Earth Engine에서 반복문으로 연도별 NPP(2001-2023)를 저장해 보겠습니다. 앞서 작성한 아래 2개 글 내용에 삽입된 코드를 응용했다고 보시면 되겠습니다.

 

Google Earth Engine: 백두대간보호지역의 NPP(순일차생산량) 계산하기

안녕하세요? 이번 글은 Google Earth Engine을 사용하여 백두대간보호지역의 NPP(순일차생산량)을 계산해 보겠습니다. 백두대간보호지역은 하나의 예시이고, 다른 지역에 대해서도 NPP를 계산할 수 있

foss4g.tistory.com

 

Google Earth Engine: 이미지를 Google Drive로 내보내는 방법 소개

안녕하세요? 이번 글은 Google Earth Engine 이미지를 Google Drive로 내보내는 방법을 소개해 보겠습니다. 이어서 내보낸 이미지를 다시 읽어와 플롯도 그려보겠습니다. 먼저, Earth Engine을 인증 및 초기

foss4g.tistory.com

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에서 다운받으실 수 있습니다.

 

전세계 국가 및 구역별 공간데이터 제공 'GADM' 소개

GADM(Global Administrative Areas) maps and data | https://gadm.org/ 안녕하세요? 이번 글에서는 전세계 국가 및 구역별 공간데이터를 제공하는 GADM을 둘러보도록 하겠습니다. 이 웹사이트는 캘리포니아 대학교

foss4g.tistory.com

 

참고로 QGIS에서는 구역 통계를 통해 NPP 픽셀 값의 합계를 계산할 수 있습니다.

 

아래와 같이 NPP_sum이 계산되었는데요, 해당 값의 단위는 kg*C/m^2이므로 NPP_sum * 250000 * 0.001 식에 따라 Mg으로 변환 처리하겠습니다.

 

필드 계산기를 열고, 해당 식을 적용하여 NPP의 Mg 수치를 변환할 수 있습니다.