Количественная оценка изменений в лесах

Начнем с расчета, необходимого для создания полосы, показывающей пиксели, в которых данные Хансена и др. показывают как потерю, так и усиление.

В наборе данных Хансена и др. есть полоса, пиксели которой равны 1 в случае потери и 0 в противном случае ( loss ), а также полоса, пиксели которой равны 1 в случае усиления и 0 в противном случае ( gain ). Чтобы создать полосу, где пиксели как в полосах loss , так и в полосах gain имеют значение 1, можно использовать логический метод and() для изображений. Метод and() вызывается аналогично image1.and(image2) и возвращает изображение, в котором пиксели равны 1, если и image1, и image2 равны 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.

Потеря Арканзаса
Рисунок 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');

Количественная оценка изменений лесного фонда в интересующем регионе

Теперь, когда вы более подробно ознакомились с полосами в наборе данных Хансена и др., мы можем использовать изученные концепции для вычисления статистики прироста и утраты лесов в интересующем нас регионе. Для этого нам понадобятся векторные данные (точки, линии и полигоны). Векторный набор данных представлен в Earth Engine как FeatureCollection . (Узнайте больше о коллекциях объектов и об импорте векторных данных .)

В этом разделе мы сравним общий объем потерь лесов, произошедших в Республике Конго в 2012 году, с объемом потерь лесов, произошедших на охраняемых территориях страны в то же время.

Как вы узнали из руководства по API Earth Engine , ключевым методом вычисления статистики в области изображения является 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() для суммирования значений пикселей в lossImage в пределах признака congo . Поскольку lossImage состоит из пикселей со значением 1 или 0 (соответственно, с потерями), сумма этих значений эквивалентна количеству пикселей с потерями в области.

К сожалению, запуск скрипта в текущем виде приводит к ошибке типа:

Максимальное количество пикселей в reduceRegion() по умолчанию составляет 10 миллионов. Это сообщение об ошибке означает, что Республика Конго покрывает около 383 миллионов пикселей 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'
);

Результаты показывают, что из 348 036 295 квадратных метров леса, утраченного в Республике Конго в 2012 году, 11 880 976 из них находились на охраняемых территориях, как указано в таблице Всемирной базы данных по охраняемым территориям .

Единственные изменения между этим скриптом и предыдущим — добавление информации о защищённой территории и изменение сценария с учёта общих потерь на учёт потерь за 2012 год. Это потребовало двух изменений. Во-первых, появилось новое изображение lossIn2012 , где убыток был зафиксирован в 2012 году, где он равен 1, а в противном случае — 0. Во-вторых, поскольку название диапазона отличается ( lossyear вместо loss ), пришлось изменить название свойства в операторе печати.

В следующем разделе мы рассмотрим некоторые передовые методы расчета и построения графиков потерь лесов за каждый год, а не только за один год, как мы это делали в этом разделе.