목차
- 기본 환경 설정 및 데이터 로딩 (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 데이터를 보정합니다.
- MODIS NDVI 원시 데이터는 정수 형식으로 저장됩니다(예: NDVI=0.5일 때 원시값은 5000).
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.0과max: 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의 확대 레벨을 조정하여 지도 시각화 효과를 보장해야 합니다.