이전에는 다음과 같이 Landsat 8 TOA 컬렉션과 관심 영역 도형을 나타내는 가져오기인 l8 및 point를 사용하여 개별 Landsat 장면을 가져오는 방법을 알아보았습니다.
코드 편집기(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 - 빨간색) / (NIR + 빨간색)입니다. 그 결과 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 색상에 관한 이 외부 참조를 참고하세요.
정규화된 차이 연산은 원격 감지에서 매우 보편적으로 사용되므로 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가 가장 높기 때문에 모두 녹색으로 표시됩니다.
지금까지 Earth Engine에서 이미지를 합성하고 모자이크 처리하는 여러 가지 방법을 살펴보았습니다. 시간 및 장소로 필터링된 이미지 또는 컬렉션의 모든 이미지에서 최근 값, 중앙값 또는 가장 녹색인 픽셀 합성물을 만들 수 있습니다. 이미지에서 계산을 수행하고 정보를 추출하는 방법을 알아봤습니다. 다음 페이지에서는 Earth Engine에서 정보를 가져오는 방법(예: 차트 또는 Google Drive 폴더로 내보낸 데이터 세트)을 설명합니다.