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