구글 엔진 엔진을 활용한 NDVI 제품 일별 및 월별 시계열 시각화 기법

목차

  • 기본 환경 설정 및 데이터 로딩 (MYD13Q1 제품)
    • 연구 영역 설정
    • MODIS MYD13Q1 제품 로딩 및 필터링
  • NDVI 데이터 전처리 및 시각화 (MYD13Q1 제품)
    • 밴드 선택 및 값 보정
    • NDVI 공간 시각화
  • NDVI 시계열 분석 (MYD13Q1 제품)
  • MOD09GA 일별 NDVI 데이터 처리
    • 일별 NDVI 데이터 로딩 및 시각화
    • 일별 NDVI 시계열 분석
  • 월평균 NDVI 데이터 생성 및 시계열 분석
    • 월평균 NDVI 데이터 생성
    • 월평균 NDVI 시계열 분석
  • 코드 핵심 로직 및 적용 시나리오 요약
  • 실행 결과

본 코드는 구글 엔진 엔진(GEE) 플랫폼을 기반으로 MODIS 위성의 두 가지 다른 제품인 NDVI(정규화 식생 지수) 데이터의 로딩, 전처리, 시각화 및 시계열 분석을 구현합니다. 2020년 단일 연도의 분기별, 일별, 월평균 NDVI 데이터 처리를 포함하며, 지역 식생 성장 상태의 시공간 변화 연구에 적용할 수 있습니다.

기본 환경 설정 및 데이터 로딩 (MYD13Q1 제품)

이 부분에서는 연구 영역을 설정하고 MODIS 식생 지수 분기 제품(MYD13Q1)의 2020년 데이터를 로딩하여, 후속 NDVI 분석의 기반을 마련합니다.

연구 영역 설정

var studyArea = roi;
Map.centerObject(studyArea, 6);
  • 변수 정의: studyArea = roi에서 roi는 사전에 정의된 "관심 영역"(Region of Interest)으로, 보통 벡터 경계(행정 구역, 연구 구역 범위 등)입니다. 이 변수를 통해 데이터 처리의 공간 범위를 지정합니다.
  • 맵 중심 설정: Map.centerObject(studyArea, 6)는 GEE 지도 인터페이스의 중심을 studyArea에 해당하는 영역으로 이동시킵니다. 두 번째 매개변수 "6"은 지도 확대 레벨(범위 1-24, 값이 클수록 시야가 가까워지고 공간 해상도가 높아짐)이며, 여기서 레벨 6은 지역 단위 공간 범위를 보기에 적합합니다.

MODIS MYD13Q1 제품 로딩 및 필터링

//MODIS/061/MYD13Q1 제품 데이터
//이미지 컬렉션 선택
var vegetationCollection = ee.ImageCollection("MODIS/006/MYD13Q1")
                    .filterDate('2020-01-01', '2020-12-31');
print(vegetationCollection); //해당 연도의 이미지 수 확인
  • 제품 설명: MODIS/006/MYD13Q1은 MODIS 위성의 식생 지수 제품으로, "006"은 제품 버전 번호입니다. 이 제품은 16일 주기로 생성되며, NDVI, EVI 등 여러 식생 지수를 포함하며, 공간 해상도는 250미터입니다. 중규모 식생 성장 상태 모니터링에 적합합니다.
  • 시간 필터링: .filterDate('2020-01-01', '2020-12-31')은 데이터 시간 범위를 2020년 전체로 제한합니다. GEE는 자동으로 해당 시간대 내의 모든 조건에 맞는 영상을 필터링하여 이미지 컬렉션(ImageCollection)을 생성합니다.
  • 데이터 확인: print(vegetationCollection)은 필터링된 이미지 컬렉션을 GEE 콘솔에 출력하여 이미지 수(2020년 총 23개, 16일/개, 366일≈23주기), 각 영상의 시간, 밴드 등 메타 정보를 확인할 수 있으며, 이를 통해 데이터 로딩이 올바른지 검증합니다.

NDVI 데이터 전처리 및 시각화 (MYD13Q1 제품)

이 부분에서는 로딩된 MYD13Q1 제품의 밴드 선택, 값 보정을 수행하고, 지도를 통해 2020년 연구 구역 NDVI 평균 상태를 시각화합니다.

밴드 선택 및 값 보정

//NDVI 밴드 선택
var ndviCollection = vegetationCollection.select("NDVI");
var applyScaleFactor = function(image) {
    //이미지에 스케일 적용
    var processedImage = image.multiply(0.0001);
    return processedImage.set('system:time_start', image.get('system:time_start'));
};
ndviCollection = ndviCollection.map(applyScaleFactor);
  • 밴드 선택: vegetationCollection.select("NDVI")는 MYD13Q1 제품의 여러 밴드 중 "NDVI" 밴드만 추출하여 NDVI 데이터만 포함된 이미지 컬렉션을 생성합니다. 다른 관련 없는 밴드(EVI, 품질 제어 밴드 등)를 제외하여 데이터 처리량을 줄입니다.
  • 값 보정 로직:
    • MODIS NDVI 원시 데이터는 정수 형식으로 저장됩니다(예: NDVI=0.5일 때 원시값은 5000). multiply(0.0001)를 통해 실제 부동소수점 NDVI 값(범위 -1~1, 여기서 양수는 식생 피복을 나타내며 값이 높을수록 식생이 무성함)으로 변환해야 합니다.
    • 함수 정의: applyScaleFactor는 단일 영상(image)을 매개변수로 받아 multiply(0.0001)로 값 보정을 수행한 후, set('system:time_start', ...)로 원본 영상의 타임스탬프를 보존합니다(후속 시계열 분석의 시간 정보 정확성 보장).
    • 일괄 처리: ndviCollection.map(applyScaleFactor)는 이미지 컬렉션의 각 영상에 applyScaleFactor 함수를 일괄 적용하여 전 컬렉션의 NDVI 데이터를 보정합니다.

NDVI 공간 시각화

//색상 팔레트 설정 및 영상 표시
var ndviVisualization = {
    min: 0.0,
    max: 1.0,
    palette: [
        'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
        '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
        '012E01', '011D01', '011301'
    ],
};
Map.addLayer(ndviCollection.median().clip(studyArea), ndviVisualization, 'NDVI');
  • 시각화 매개변수 설정: ndviVisualization은 시각화 구성 객체로, 3개의 핵심 매개변수를 포함합니다:
    • min: 0.0max: 1.0: NDVI 값의 표시 범위를 정의하며, 여기서는 음수(보통 수역, 노지 등 비식생 영역)를 무시하고 0~1의 식생 피복 영역만 표시합니다.
    • palette: 색상 그라데이션 목록으로, 흰색(FFFFFF, NDVI≈0에 해당, 식생이 드문무성하거나 없음)에서 진한 녹색(011301, NDVI≈1에 해당, 식생이 무성함)까지이며, 색상 차이를 통해 식생 피복 정도를 직관적으로 구분합니다.
  • 영상 합성 및 클리핑:
    • ndviCollection.median(): 2020년 모든 보정된 NDVI 영상에 대해 "중앙값 합성"을 계산합니다. 중앙값은 구름, 그림자 등 노이즈가 NDVI 값에 미치는 영향을 효과적으로 줄입니다(평균에 비해 이상값에 덜 민감). 이를 통해 2020년 연구 구역 NDVI 평균 상태 영상을 생성합니다.
    • .clip(studyArea): 합성된 영상을 roi 연구 구역 내로 클리핑하여 연구 구역 데이터만 남기고 관련 없는 영역을 제외시킵니다. 시각화 결과를 더 집중적으로 만듭니다.
  • 맵에 레이어 추가: Map.addLayer(...)는 처리된 NDVI 영상을 GEE 지도 인터페이스에 추가합니다. 세 번째 매개변수 'NDVI'는 레이어 이름으로, 지도 우측 상단 레이어 목록에서 해당 레이어를 확인하거나 켤 수 있습니다.

NDVI 시계열 분석 (MYD13Q1 제품)

꺾은선도를 그려 2020년 연구 구역 NDVI(MYD13Q1 제품, 16일 주기)의 시간 변화 추세를 표시하며, 식생 성장의 계절적 변동을 반영합니다.

//NDVI 연간 변화 꺾은선도 그리기
print(ui.Chart.image.series(ndviCollection, studyArea, ee.Reducer.mean(), 250));
  • 차트 생성 함수: ui.Chart.image.series(...)는 GEE에서 영상 시계열 차트를 생성하는 핵심 함수이며, 다음과 같은 매개변수를 가집니다:
    • ndviCollection: 입력된 NDVI 영상 컬렉션(시계열 정보 포함).
    • studyArea: 통계 공간 범위(연구 구역 roi). 이 함수는 해당 영역 내 각 시간 노드(16일마다)의 NDVI 평균값을 계산하여 전체 식생 상태를 반영합니다.
    • ee.Reducer.mean(): 통계 방법으로, 여기서는 "평균 리듀서"를 사용하며, 연구 구역 내 각 시간 노드(16일마다)의 NDVI 평균값을 계산하여 전체 식생 상태를 반영합니다.
    • 250: 공간 해상도(단위: 미터). MYD13Q1 제품 원래 해상도가 250미터이므로, 여기서는 제품 해상도와 일치하도록 설정하여 리샘플링으로 인한 오차를 방지합니다.
  • 차트 출력: print(...)는 생성된 꺾은선도를 콘솔에 출력합니다. 가로축은 시간(2020년 1-12월, 16일마다 노드), 세로축은 NDVI 평균값이며, 식생 성장의 계절적 변화(예: 여름 NDVI 높음, 겨울 낮음)를 직관적으로 관찰할 수 있습니다.

MOD09GA 일별 NDVI 데이터 처리

이 부분에서는 MODIS 지표 반사율 제품(MOD09GA)에서 파생된 일별 NDVI 데이터를 로딩하고, 데이터 로딩, 시각화 및 시계열 분석을 완료하며, 추가적으로 월평균 NDVI 데이터를 생성합니다.

일별 NDVI 데이터 로딩 및 시각화

//MODIS/061/MOD09GA 제품 데이터
//영상 로딩
var dailyVegetationIndex = ee.ImageCollection("MODIS/MOD09GA_006_NDVI")
                  .filterDate('2020-01-01', '2020-12-31')
                  .select('NDVI');
print(dailyVegetationIndex);
//1년간 영상 수 확인
Map.addLayer(dailyVegetationIndex.mean().clip(studyArea), ndviVisualization, 'dailyNDVI');
  • 제품 설명: MODIS/MOD09GA_006_NDVI는 MOD09GA 지표 반사율 제품을 기반으로 계산된 일별 NDVI 데이터로, "006"은 버전 번호이며, 공간 해상도는 500미터(MYD13Q1의 250미터보다 높음), 시간 해상도는 1일입니다. 더 높은 시간 빈도의 식생 동태 모니터링에 적합합니다.
  • 데이터 필터링 및 확인:
    • .filterDate(...)는 동일하게 2020년 전체 데이터를 필터링하고, .select('NDVI')는 NDVI 밴드를 추출하여 일별 NDVI 영상 컬렉션을 생성합니다.
    • print(dailyVegetationIndex)는 영상 컬렉션을 콘솔에 출력하여 2020년 일별 영상 수(약 365개, 구름 커버等原因으로 366개 미만일 수 있음)를 확인하고 데이터 완전성을 검증합니다.
  • 일별 NDVI 평균 시각화: dailyVegetationIndex.mean().clip(studyArea)는 2020년 일별 NDVI의 연간 평균을 계산하고, Map.addLayer(...)를 통해 지도에 추가합니다. 레이어 이름은 'dailyNDVI'이며, MYD13Q1의 중앙값 합성 영상과 비교하여 다른 제품의 연간 평균 식생 피차 차이를 관찰할 수 있습니다.

일별 NDVI 시계열 분석

여기서 통계할 때 픽셀 크기를 1000으로 선택할 수 있습니다. 필요에 따라 조정 가능
print(ui.Chart.image.series(dailyVegetationIndex, studyArea, ee.Reducer.mean(), 1000));
  • 시계열 차트 생성: MYD13Q1의 시계열 분석 로직과 동일하지만, 두 가지 차이점이 있습니다:
    • 시간 해상도: 입력된 dailyVegetationIndex는 일별 데이터이므로, 차트 가로축은 2020년 매일이며 시간 노드가 더 밀집되어 있어 더 세밀한 식생 동태(예: 단기 강수, 가뭄이 NDVI에 미치는 영향)를 반영할 수 있습니다.
    • 공간 해상도: 여기서는 1000미터(제품 원래 해상도 500미터보다 높음)로 설정되었으며, 이는 데이터 양을 줄이고 차트 생성 속도를 높이기 위함입니다(리샘플링을 더 낮은 해상도로 설정하면 계산 복잡도를 낮출 수 있습니다). 실제 연구에서는 필요에 따라 500미터(제품 원래 해상도와 일치)로 조정할 수 있습니다.
  • 차트 해석: 세로축은 연구 구역 일별 NDVI 평균값, 가로축은 날짜이며, 꺾은선은 더 빈번한 변동(날씨, 물후 등 단기 영향으로 인함)을 보일 것입니다. 이러한 변동 원인을 분석하기 위해 강수량, 온도 등 데이터와 결합해야 합니다.

월평균 NDVI 데이터 생성 및 시계열 분석

일별 데이터의 노이즈 간섭을 줄이고 식생 성장의 월별 변화 추세를 더 명확하게 표시하기 위해, 이 부분에서는 일별 NDVI 데이터를 월평균 NDVI 데이터로 집계하고 월별 시계열 차트를 생성합니다.

월평균 NDVI 데이터 생성

//먼저 연구할 시간 범위를 필터링
var targetYears = ee.List.sequence(2020, 2020);
var targetMonths = ee.List.sequence(1, 12);
//일별 데이터에서 월평균 데이터 생성
var monthlyAvgNDVI = ee.ImageCollection.fromImages(
  targetYears.map(function (y) {
    return targetMonths.map(function(m) {
      return dailyVegetationIndex
        .filter(ee.Filter.calendarRange(y, y, 'year'))
        .filter(ee.Filter.calendarRange(m, m, 'month'))
        .mean()
        .set('year', y)
        .set('month', m)
        .set('system:time_start', ee.Date.fromYMD(y, m, 1));
    });
  }).flatten()
);
  • 시계열 구성: ee.List.sequence(2020, 2020)은 2020년만 포함하는 연도 목록을 생성하고, ee.List.sequence(1, 12)은 1-12월의 월 목록을 생성하며, 후속 "년-월" 기준 데이터 필터링을 위한 기초를 제공합니다.
  • 월별 집계 로직:
    • 연도 루프: targetYears.map(function (y) {...})는 연도 목록의 각 연도(여기서는 2020년만)에 대해 루프를 실행합니다.
    • 월 루프: targetMonths.map(function(m) {...})는 각 연도의 1-12월에 대해 루프를 실행하여 "년-월" 조합(예: 2020-01, 2020-02)을 형성합니다.
    • 데이터 필터링 및 집계:
      • .filter(ee.Filter.calendarRange(y, y, 'year')).filter(ee.Filter.calendarRange(m, m, 'month'))는 "y년 m월"의 모든 일별 NDVI 영상을 필터링합니다.
      • .mean()은 해당 월의 모든 일별 NDVI 평균을 계산하여 "월평균 NDVI 영상"을 생성합니다. 이는 일별 데이터의 노이즈(예: 단일 날짜 구름 커버로 인한 NDVI 이상치)를 줄입니다.
    • 메타 정보 설정:
      • .set('year', y).set('month', m)는 월평균 영상에 연도, 월 속성을 추가하여 후속 데이터 관리를 용이하게 합니다.
      • .set('system:time_start', ee.Date.fromYMD(y, m, 1))는 월평균 영상의 타임스탬프를 해당 월 1일(예: 2020-01-01)로 설정하여 시계열 차트의 가로축 시간 정확성을 보장합니다.
    • 영상 컬렉션 변환:
      • targetYears.map(...)targetMonths.map(...)는 중첩 목록(연도 목록이 월 목록을 포함하고, 월 목록이 월평균 영상을 포함)을 생성하며, .flatten()은 중첩 목록을 "펼쳐서" 1차원 목록으로 만듭니다.
      • ee.ImageCollection.fromImages(...)는 펼쳐진 월평균 영상 목록을 영상 컬렉션(monthlyAvgNDVI)으로 변환하여 후속 시각화 및 시계열 분석에 용이하게 합니다.

월평균 NDVI 시계열 분석

//차트 생성 및 출력
print(ui.Chart.image.series(monthlyAvgNDVI, studyArea, ee.Reducer.mean(), 1000));
  • 월별 시계열 차트:
    • 입력된 monthlyAvgNDVI는 월평균 NDVI 영상 컬렉션으로, 차트 가로축은 2020년 1-12월(매월 하나의 노드), 세로축은 연구 구역 월평균 NDVI 평균값입니다.
    • 일별 차트에 비해 이 차트는 더 부드러우며, 식생 성장의 월별 추세(예: 북반온대 지역通常 5-9월 NDVI 높음, 12-2월 NDVI 낮음)를 명확하게 표시하여 식생 성장의 핵심 시기(예: 푸르름기, 시들기기)를 식별하기 용이합니다.
  • 해상도 설정: 여기서도 1000미터 해상도를 사용하며, 이는 계산 속도와 데이터 정확도의 균형을 맞추기 위함입니다. 실제 연구에서는 500미터(MOD09GA 제품 원래 해상도와 일치)로 조정할 수 있습니다.

코드 핵심 로직 및 적용 시나리오 요약

핵심 로직:

  • 데이터 계층 처리: MODIS의 두 가지 다른 시간 해상도 제품(MYD13Q1: 16일, MOD09GA: 1일)에 대해 각각 "로딩 - 필터링 - 보정 - 합성" 처리 프로세스를 완료하여 다양한 시공간 규모의 분석 요구를 충족시킵니다.
  • 다차원 분석: 공간 시각화(연간 평균 NDVI 분포)와 시계열 분석(16일, 일별, 월별 NDVI 변화)을 포함하여 "공간 분포"와 "시간 동적" 두 차원에서 식생 성장 상태를 분석합니다.
  • 노이즈 제어: 중앙값 합성(MYD13Q1), 평균 집계(일별 → 월별)를 통해 구름, 그림자 등 노이즈가 NDVI 데이터에 미치는 간섭을 줄여 분석 결과의 신뢰성을 높입니다.

적용 시나리오:

  • 식생 동태 모니터링: 연구 구역 2020년 식생 피복의 계절적 변화를 분석하고, 식생 성장의 핵심 물후기(예: 푸르름기, 개화기, 시들기기)를 식별합니다.
  • 생태 상태 평가: 연간 평균 NDVI 공간 분포를 통해 연구 구역 식생 피복의 공간적 차이(예: 산지와 평원, 경작지와 숲지의 NDVI 비교)를 평가합니다.
  • 재해 영향 분석: 일별 NDVI 시계열을 결합하여 단기 재해(예: 가뭄, 홍수)가 식생 성장에 미치는 영향(예: 재해 기간 NDVI 급감)을 분석합니다.

주의 사항:

  • 데이터 해상도 일치: 다양한 MODIS 제품의 공간 해상도가 다르므로(MYD13Q1: 250미터, MOD09GA: 500미터), 시계열 분석에서 scale 매개변수 설정 시 제품 원래 해상도와 일치하도록 권장하며, 리샘플링으로 인한 오차를 방지합니다.
  • 구름 커버 영향: 중앙값, 평균 합성을 통해 구름 간섭을 줄였지만, 고 구름 커버 영역의 NDVI 데이터에는 여전히 편차가 있을 수 있으므로, MODIS 품질 제어 밴드와 결합하여 고품질 데이터를 추가로 필터링해야 합니다.
  • 영역 적응성: 코드 내 roi는 사전에 정의되어야 합니다(예: GEE 도구로 그리기 또는 벡터 파일 가져오기). 다양한 연구 구역에 따라 Map.centerObject의 확대 레벨을 조정하여 지도 시각화 효과를 보장해야 합니다.

실행 결과

콘솔 실행 결과
연구 구역 2020년 월평균 NDVI 변화 꺾은선도(MYD13Q1 제품 데이터)
연구 구역 2020년 NDVI 시각화 결과(MYD13Q1 제품 데이터)
연구 구역 2020년 NDVI 시계열 꺾은선도(MOD09GA 제품 데이터)
연구 구역 2020년 월평균 NDVI 변화 꺾은선도(MOD09GA 제품 데이터)
연구 구역 2020년 NDVI 시각화 결과(MOD09GA 제품 데이터)

태그: 구글 엔진 엔진 NDVI 시계열 분석 MODIS 식생 모니터링

6월 23일 02:43에 게시됨