Google Earth Engine: замаскируйте облака и сопоставьте функцию с коллекцией изображений различных датчиков

Я хочу объединить все датчики Landsat с 1985 года по сегодняшний день в Google Earth Engine, удалить облака и рассчитать временные ряды индекса NBR. Как новый пользователь GEE у меня есть следующее:

// find all data and filter them by date
var lst5 = ee.ImageCollection('LANDSAT/LT5_SR').filterDate('1984-10-01', '2011-10-01');
var lst7 = ee.ImageCollection('LANDSAT/LE7_SR').filterDate('2011-10-01', '2013-04-07');
var lst8 = ee.ImageCollection('LANDSAT/LC8_SR').filterDate('2013-04-07', '2018-05-01');
var lst7_08 = ee.ImageCollection('LANDSAT/LE7_SR').filterDate('2007-12-01', '2008-02-01');
var lst7_92 = ee.ImageCollection('LANDSAT/LT4_SR').filterDate('1992-01-02', '1992-04-01');


// Combine all landsat data, 1985 through 2015
var everything = ee.ImageCollection(lst5.merge(lst7));
everything = everything.merge(lst8);
everything = everything.merge(lst7_08);
everything = everything.merge(lst7_92);

var alltogether = ee.ImageCollection(everything.filterDate('1984-01-01', '2018-05-01'));

С этого момента я не знаю, как удалить облака и рассчитать индекс NBR ( индекс NBR здесь) для каждого изображения в моей окончательной коллекции.

Может кто-нибудь мне помочь?

Спасибо.

РЕДАКТИРОВАТЬ:

Я думаю, что мне нужно отобразить normalizedDifference работать над моей коллекцией, чтобы получить индекс NBR, но я не уверен, как это сделать для моей коллекции с различными датчиками.

2 ответа

Решение

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

// Function to cloud mask Landsat 8.
var maskL8SR = function(image) {
  // Bits 3 and 5 are cloud shadow and cloud, respectively.
  var cloudShadowBitMask = ee.Number(2).pow(3).int();
  var cloudsBitMask = ee.Number(2).pow(5).int();
  // Get the QA band.
  var qa = image.select('pixel_qa');
  // Both flags should be set to zero, indicating clear conditions.
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0).and(
            qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image
      // Scale the data to reflectance and temperature.
      .select(['B5', 'B7'], ['NIR', 'SWIR']).multiply(0.0001)
      .addBands(image.select(['B11'], ['Thermal']).multiply(0.1))
      .updateMask(mask);
};

// Function to cloud mask Landsats 5-7
var maskL57SR = function(image) {
  var qa = image.select('pixel_qa');
  // Second bit must be zero, meaning none to low cloud confidence.
  var mask1 = qa.bitwiseAnd(ee.Number(2).pow(7).int()).eq(0).and(
      qa.bitwiseAnd(ee.Number(2).pow(3).int()).lte(0)); // cloud shadow
  // This gets rid of irritating fixed-pattern noise at the edge of the images.
  var mask2 = image.select('B.*').gt(0).reduce('min');
  return image
      .select(['B4', 'B7'], ['NIR', 'SWIR']).multiply(0.0001)
      .addBands(image.select(['B6'], ['Thermal']).multiply(0.1))
      .updateMask(mask1.and(mask2));
};

// find all data and filter them by date
var lst5 = ee.ImageCollection('LANDSAT/LT05/C01/T1_SR')
    .filterDate('1984-10-01', '2011-10-01')
    .map(maskL57SR)
var lst7 = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR')
    .filterDate('2011-10-01', '2013-04-07')
    .map(maskL57SR)
var lst8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
    .filterDate('2013-04-07', '2018-05-01')
    .map(maskL8SR)
var lst7_08 = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR')
    .filterDate('2007-12-01', '2008-02-01')
    .map(maskL57SR)
var lst7_92 = ee.ImageCollection('LANDSAT/LT04/C01/T1_SR')
    .filterDate('1992-01-02', '1992-04-01')
    .map(maskL57SR)

// Combine all landsat data, 1985 through 2015
var everything = ee.ImageCollection(lst5.merge(lst7));
everything = everything.merge(lst8);
everything = everything.merge(lst7_08);
everything = everything.merge(lst7_92);

// NBR:
var nbrFunction = function(image) {
  image = ee.Image(image)
  return image.addBands(image.expression(
    '(nir - 0.0001 * swir * thermal) / ' +
    '(nir + 0.0001 * swir * thermal)', {
      nir: image.select(['NIR']),
      swir: image.select(['SWIR']),
      thermal: image.select(['Thermal'])
    }).rename('NBR').clamp(-1, 1));
};

everything = everything.map(nbrFunction);

var check = ee.Image(everything.first());
Map.centerObject(check);
Map.addLayer(check);

Ответ отлично работает для изображений SR! Спасибо! Извините, я не могу просто прокомментировать, потому что у меня еще нет репутации 50, но я видел вопрос @Abhilash Singh Chauhan о том, почему ee.Number(2).pow(3)... используется для переменных cloudshadow и cloud. У меня был тот же вопрос, и я хотел ответить, что это связано с тем, что полосы QA Pixel представляют собой десятичные целые числа, содержащие двоичную информацию. Так, например, полоса 3 для продуктов LANDSAT для отражательной способности поверхности указывает полосу для тени от облаков, но значения представлены в двоичном формате. Чтобы получить значения, вам нужно преобразовать диапазон в двоичный формат, следовательно, 2^3 и аналогично 2^5 для значений облака. Я надеюсь, что это проясняет комментарий. вы можете проверить это здесь: https://www.usgs.gov/landsat-missions/landsat-4-7-surface-reflectance-quality-assessment

Другие вопросы по тегам