NDVI, 컬렉션에 함수 매핑, 품질 모자이크

이전에는 다음과 같이 하여 개별 Landsat 장면을 가져오는 방법을 배웠습니다. 여기서 l8point는 Landsat 8 TOA 컬렉션과 관심 영역 지오메트리를 나타내는 가져오기입니다.

코드 편집기 (JavaScript)

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

이제 Landsat 이미지에서 정규 식생 지수 (NDVI) 이미지를 계산한다고 가정해 보겠습니다. 식물은 전자기 스펙트럼의 근적외선 (NIR) 부분에서 빛을 반사하고 빨간색 부분에서 빛을 흡수합니다 (식물의 NIR 반사율 자세히 알아보기). NDVI는 이를 사용하여 픽셀에서 발생하는 광합성 활동을 대략적으로 반영하는 단일 값을 생성합니다. 계산은 (NIR - red) / (NIR + red)입니다. 이로 인해 1과 -1 사이의 값이 생성되며, 광합성 활동이 높은 픽셀은 NDVI가 높습니다. 다음은 Earth Engine에서 NDVI를 계산하는 한 가지 방법입니다.

코드 편집기 (JavaScript)

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

결과는 그림 8과 같이 표시됩니다. 마스크에 관한 이전 섹션에서 알아본 select() 함수를 사용하여 NIR 및 빨간색 밴드를 가져온 다음 Image 수학에 관한 섹션에서 이전에 본 이미지 수학 연산자를 사용하여 NDVI를 계산합니다. 마지막으로 팔레트를 사용하여 이미지를 표시합니다. 여기서는 팔레트에서 16진수 문자열 대신 색상 이름을 사용했습니다. (자세한 내용은 CSS 색상에 관한 외부 참조를 참고하세요.)

Tutorial_api_08_ndvi.png
그림 8. 단일 Landsat 장면의 NDVI입니다. 파란색은 NDVI가 낮고 녹색은 NDVI가 높습니다.

정규화된 차이 연산은 원격 감지에서 매우 일반적이므로 이전 예의 코드를 간소화하는 데 유용한 ee.Image단축키 함수가 있습니다.

코드 편집기 (JavaScript)

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

컬렉션에 함수 매핑

이제 이미지 컬렉션의 모든 이미지에 NDVI를 추가한다고 가정해 보겠습니다. Earth Engine에서 이 작업을 수행하는 방법은 컬렉션에서 함수를 map()하는 것입니다. map()Map 객체와 혼동하지 마세요. 전자는 컬렉션의 메서드이며 컬렉션의 모든 요소에 함수를 적용하는 병렬 컴퓨팅 의미에서 map을 사용합니다. 이 함수는 컬렉션의 모든 요소에 적용될 작업을 정의합니다. JavaScript 튜토리얼의 간단한 함수를 살펴봤지만 이제 Earth Engine 기능을 포함하는 함수를 만들어 보겠습니다. 예를 들어 이전 NDVI 코드를 NDVI 밴드가 있는 입력 이미지를 반환하는 함수에 복사합니다.

코드 편집기 (JavaScript)

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

이 코드는 단일 이미지의 NDVI를 계산하는 데는 효율적이지 않을 수 있지만 이 함수를 map()의 인수로 사용하여 컬렉션의 모든 이미지에 NDVI 밴드를 추가할 수 있습니다. 함수가 예상대로 작동하는지 확인하기 위해 단일 이미지에서 먼저 함수를 테스트하는 것이 유용할 때가 많습니다. 개별 이미지에서 함수를 테스트하고 원하는 대로 작동하는지 확인한 후에는 컬렉션에 매핑할 수 있습니다.

코드 편집기 (JavaScript)

var withNDVI = l8.map(addNDVI);

이 컬렉션의 모든 이미지에 NDVI 밴드가 실제로 배치되는지 확인하려면 withNDVI 컬렉션을 지도에 추가하고 인스펙터 탭으로 임의의 위치를 쿼리하면 됩니다. 이제 컬렉션의 각 이미지에 NDVI라는 밴드가 있습니다.

가장 푸른 픽셀 합성 만들기

이제 각 이미지에 NDVI 밴드가 있는 이미지 컬렉션을 만들었으므로 qualityMosaic()를 사용하여 컴포지션을 만드는 새로운 방법을 살펴볼 수 있습니다. 중간 픽셀 컴포지트에서도 Landsat 경로 간 불연속성이 나타날 수 있습니다. 이는 인접한 경로의 이미지가 서로 다른 시간 (특히 8일 차이)에 수집되어 생태학에 차이가 있기 때문일 수 있습니다. 이를 최소화하는 한 가지 방법은 식물의 최대 녹색도 시기 (잎이 있고 광합성 활동이 활발한 시기)와 같이 대략 동일한 생물 계절학적 단계에서 합성의 픽셀 값을 설정하는 것입니다. 최대 녹색도를 최대 NDVI로 정의하면 qualityMosaic()를 사용하여 각 픽셀에 컬렉션의 최대 NDVI 픽셀이 포함된 컴포지션을 만들 수 있습니다. 이제 withNDVI 컬렉션에서 추가된 NDVI 밴드를 사용할 수 있습니다.

코드 편집기 (JavaScript)

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

이 코드의 결과는 그림 9와 같습니다. 그림 9를 그림 6에 표시된 중간 복합 이미지와 비교하면 가장 녹색인 픽셀 복합 이미지가 실제로 훨씬 더 녹색임을 알 수 있습니다. 하지만 수역을 자세히 살펴보면 다른 문제가 드러날 수 있습니다. 특히 수역이 흐리게 표시됩니다. 이는 qualityMosaic() 메서드의 작동 방식 때문입니다. 각 위치에서 전체 시계열이 검사되고 NDVI 밴드에서 최댓값을 갖는 픽셀이 합성 값으로 설정됩니다. NDVI는 물보다 구름에서 더 높기 때문에 물 영역은 흐린 픽셀을 갖게 되며, 식물이 있는 영역은 모두 녹색으로 표시됩니다. 픽셀의 식물이 광합성으로 활성화되어 있을 때 NDVI가 가장 높기 때문입니다.

Tutorial_api_09_greenest.png
그림 9. Landsat 8 가장 푸른 픽셀 합성

이제 Earth Engine에서 이미지를 합성하고 모자이크하는 여러 방법을 살펴보았습니다. 시간과 장소로 필터링된 이미지 또는 컬렉션의 모든 이미지에서 최근 값, 중앙값 또는 가장 녹색인 픽셀 합성 이미지를 만들 수 있습니다. 이미지에서 계산을 수행하고 정보를 추출하는 방법을 배웠습니다. 다음 페이지에서는 Earth Engine에서 정보를 가져오는 방법(예: Google Drive 폴더로 내보낸 차트 또는 데이터 세트)을 다룹니다.