Hansen et al. 데이터에서 손실과 이득이 모두 표시되는 픽셀을 보여주는 밴드를 만드는 데 필요한 계산부터 시작해 보겠습니다.
Hansen et al. 데이터 세트에는 손실이 발생한 픽셀이 1이고 그 외에는 0인 밴드 (loss
)와 증가가 발생한 픽셀이 1이고 그 외에는 0인 밴드 (gain
)가 있습니다. loss
및 gain
밴드의 픽셀이 모두 1인 밴드를 만들려면 이미지에서 and()
논리 메서드를 사용하면 됩니다. and()
메서드는 image1.and(image2)
와 같이 호출되며, image1과 image2가 모두 1인 픽셀은 1이고 그 외에는 0인 이미지를 반환합니다.
코드 편집기 (JavaScript)
// Load the data and select the bands of interest. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); var gainImage = gfc2014.select(['gain']); // Use the and() method to create the lossAndGain image. var gainAndLoss = gainImage.and(lossImage); // Show the loss and gain image. Map.addLayer(gainAndLoss.updateMask(gainAndLoss), {palette: 'FF00FF'}, 'Gain and Loss');
아칸소주가 확대되고 위성 뷰가 표시된 결과는 그림 1과 비슷해야 합니다.

이 예시를 이전 섹션의 결과와 결합하면 튜토리얼 시작 부분의 그림을 다시 만들 수 있습니다.
코드 편집기 (JavaScript)
// Displaying forest, loss, gain, and pixels where both loss and gain occur. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); var gainImage = gfc2014.select(['gain']); var treeCover = gfc2014.select(['treecover2000']); // Use the and() method to create the lossAndGain image. var gainAndLoss = gainImage.and(lossImage); // Add the tree cover layer in green. Map.addLayer(treeCover.updateMask(treeCover), {palette: ['000000', '00FF00'], max: 100}, 'Forest Cover'); // Add the loss layer in red. Map.addLayer(lossImage.updateMask(lossImage), {palette: ['FF0000']}, 'Loss'); // Add the gain layer in blue. Map.addLayer(gainImage.updateMask(gainImage), {palette: ['0000FF']}, 'Gain'); // Show the loss and gain image. Map.addLayer(gainAndLoss.updateMask(gainAndLoss), {palette: 'FF00FF'}, 'Gain and Loss');
관심 지역의 산림 변화 정량화
이제 Hansen et al. 데이터 세트의 밴드에 대해 잘 알게 되었으므로 지금까지 배운 개념을 사용하여 관심 지역의 산림 증가 및 손실에 관한 통계를 계산할 수 있습니다. 이를 위해서는 벡터 데이터 (점, 선, 다각형)를 사용해야 합니다. 벡터 데이터 세트는 Earth Engine에서 FeatureCollection
로 표현됩니다.
(기능 모음 및 벡터 데이터 가져오기 방법을 자세히 알아보세요.)
이 섹션에서는 2012년에 콩고 공화국 내에서 발생한 총 산림 손실량을 같은 시기에 국가 보호 구역 내에서 발생한 산림 손실량과 비교합니다.
Earth Engine API 튜토리얼에서 살펴본 바와 같이 이미지 영역에서 통계를 계산하는 주요 메서드는 reduceRegion()
입니다. (이미지 영역을 줄이는 방법 자세히 알아보기) 예를 들어 연구 기간 동안 산림 손실을 나타내는 것으로 추정되는 픽셀 수를 계산한다고 가정해 보겠습니다. 이를 위해 다음 코드를 고려하세요.
코드 편집기 (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo')); // Get the forest loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); // Sum the values of forest loss pixels in the Congo Republic. var stats = lossImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo, scale: 30 }); print(stats);
이 예에서는 ee.Reducer.sum()
리듀서를 사용하여 congo
피처 내 lossImage
의 픽셀 값을 합산합니다. lossImage
은 값이 1 또는 0인 픽셀로 구성되므로 (각각 손실 또는 비손실) 이러한 값의 합계는 영역의 손실 픽셀 수와 동일합니다.
안타깝게도 스크립트를 그대로 실행하면 다음과 같은 오류가 발생합니다.
reduceRegion()
의 기본 최대 픽셀 수는 1,000만 개입니다. 이 오류 메시지는 콩고 공화국이 약 3억 8,300만 개의 Landsat 픽셀을 포함하고 있음을 나타냅니다. 다행히 reduceRegion()
은 여러 매개변수를 사용하며 그중 하나 (maxPixels
)를 사용하면 계산에 사용되는 픽셀 수를 제어할 수 있습니다. 이 매개변수를 지정하면 계산이 성공합니다.
코드 편집기 (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo')); // Get the forest loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); // Sum the values of forest loss pixels in the Congo Republic. var stats = lossImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo, scale: 30, maxPixels: 1e9 }); print(stats);
콘솔에 출력된 객체를 확장하여 손실된 산림이 4897933픽셀임을 확인합니다. 출력에 라벨을 지정하고 reduceRegion()
에서 반환된 사전에서 원하는 결과를 가져와 콘솔의 출력을 약간 정리할 수 있습니다.
코드 편집기 (JavaScript)
print('pixels representing loss: ', stats.get('loss'));
픽셀 영역 계산
이제 콩고 공화국에서 손실된 면적과 그중 보호 구역의 면적을 묻는 질문에 답할 준비가 거의 되었습니다. 나머지 부분은 픽셀을 실제 영역으로 변환하는 것입니다. 이 변환은 reduceRegion()
에 입력되는 픽셀 크기를 알 수 없기 때문에 중요합니다. 영역을 계산하는 데 도움이 되도록 Earth Engine에는 각 픽셀의 값이 제곱미터 단위의 픽셀 영역인 이미지를 생성하는 ee.Image.pixelArea()
메서드가 있습니다. 손실 이미지에 이 영역 이미지를 곱한 다음 결과를 합하면 영역의 측정값이 나옵니다.
코드 편집기 (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo')); // Get the forest loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); var areaImage = lossImage.multiply(ee.Image.pixelArea()); // Sum the values of forest loss pixels in the Congo Republic. var stats = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo, scale: 30, maxPixels: 1e9 }); print('pixels representing loss: ', stats.get('loss'), 'square meters');
이제 연구 기간 동안 손실된 면적은 4,372,575,052제곱미터입니다.
이제 이 섹션의 시작 부분에 나온 질문에 답할 수 있습니다. 2012년에 콩고 공화국에서 손실된 산림 면적은 얼마이며, 그중 보호 구역에 있는 면적은 얼마인가요?
코드 편집기 (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = ee.Feature( countries .filter(ee.Filter.eq('country_na', 'Rep of the Congo')) .first() ); // Subset protected areas to the bounds of the congo feature // and other criteria. Clip to the intersection with congo. var protectedAreas = ee.FeatureCollection('WCMC/WDPA/current/polygons') .filter(ee.Filter.and( ee.Filter.bounds(congo.geometry()), ee.Filter.neq('IUCN_CAT', 'VI'), ee.Filter.neq('STATUS', 'proposed'), ee.Filter.lt('STATUS_YR', 2010) )) .map(function(feat){ return congo.intersection(feat); }); // Get the loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossIn2012 = gfc2014.select(['lossyear']).eq(12); var areaImage = lossIn2012.multiply(ee.Image.pixelArea()); // Calculate the area of loss pixels in the Congo Republic. var stats = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo.geometry(), scale: 30, maxPixels: 1e9 }); print( 'Area lost in the Congo Republic:', stats.get('lossyear'), 'square meters' ); // Calculate the area of loss pixels in the protected areas. var stats = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: protectedAreas.geometry(), scale: 30, maxPixels: 1e9 }); print( 'Area lost in protected areas:', stats.get('lossyear'), 'square meters' );
출력은 2012년 콩고 공화국에서 손실된 348,036,295제곱미터의 산림 중 11,880,976제곱미터가 세계 보호 지역 데이터베이스 표에 표시된 대로 보호 지역에 있음을 나타냅니다.
이 스크립트와 바로 이전 스크립트의 유일한 차이점은 보호된 지역 정보가 추가되고 스크립트가 전체 손실을 살펴보는 것에서 2012년의 손실을 살펴보는 것으로 변경되었다는 것입니다. 이를 위해 두 가지를 변경해야 했습니다. 먼저 2012년에 손실이 기록된 곳은 1이고 그 외에는 0인 새로운 lossIn2012
이미지가 있습니다. 두 번째로, 밴드 이름이 다르기 때문에 (loss
대신 lossyear
) 출력문에서 속성 이름을 변경해야 했습니다.
다음 섹션에서는 이 섹션에서와 같이 한 해가 아닌 매년 산림 손실을 계산하고 차트로 표시하는 몇 가지 고급 방법을 살펴봅니다.