Это сводит меня с ума, но я знаю, что есть очень простое решение для этого.
Есть много вещей в Интернете о том, как создавать безоблачные изображения, но когда я использую MEAN-редуктор и пытаюсь отобразить вывод, я получаю ошибку:
Безоблачное среднее: ошибка слоя: Image.bitwiseAnd: Битовые операнды должны быть только целыми числами.
Я думаю, что эта ошибка связана с типом данных и похожа на проблему, опубликованную здесь: https://gis.stackexchange.com/questions/337234/applying-a-cloud-mask-to-a-gap-filled-landsat-7-slc-off-image
Однако, когдаЯ пытаюсь изменить тип данных, я получаю ошибки, которые просто не имеют смысла:
mean = Array.int16 (mean) Array.int16 не является функцией
У меня четыревыходы: с облаками / без фильтра;не фильтровать облака;средний редуктор с облаками;и означает редуктор без облаков (не могу отобразить последний).
Самое странное, что этот код работает с редуктором MIN или MAX, но не с редукторами MEDIAN или MEAN. Что-то должно происходить с полосой / типом данных при выполнении медианы / среднего редуктора.
Код приведен ниже, заранее спасибо за помощь.
var region = ee.Geometry.Polygon([
[[-3.9622, 40.5661], [-3.3195, 40.6662], [-3.3469, 40.1307], [-4.0391, 40.1979],]
]);
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.filterDate('2015-01-01', '2015-12-31')
.filterMetadata('CLOUD_COVER', 'less_than', 45)
.filterBounds(region);
var mean = landsat8.reduce(ee.Reducer.mean());
//Change band types
//mean = Array.int16(mean)
var composite = landsat8
.mosaic()
////////////////////////////////////////////////////////////
/////////////////Start Function/////////////////////////////
////////////////////////////////////////////////////////////
// Fmask classification values var FMASK_CLEAR_GROUND = 0; var FMASK_WATER = 2;
//var FMASK_CLOUD_SHADOW = 3; var FMASK_SNOW = 4; var FMASK_CLOUD = 5;
var getQABits = function(image, start, end, newName) {
// Compute the bits we need to extract.
var pattern = 0;
for (var i = start; i <= end; i++) {
pattern += Math.pow(2, i);
}
// Return a single band image of the extracted QA bits, giving the band
// a new name.
return image.select([0], [newName])
.bitwiseAnd(pattern)
.rightShift(start);
};
// A function to mask out cloudy pixels.
var cloud_shadows = function(image) {
// Select the QA band.
var QA = image.select(['pixel_qa']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA, 3,3, 'Cloud_shadows').eq(0);
// Return an image masking out cloudy areas.
};
// Second function to mask out cloudy pixels.
var cloud_shadows_mean = function(image) {
// Select the QA band.
var QA_mean = image.select(['pixel_qa_mean']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA_mean, 3,3, 'Cloud_shadows_mean').eq(0);
// Return an image masking out cloudy areas.
};
// A function to mask out cloudy pixels.
var clouds = function(image) {
// Select the QA band.
var QA = image.select(['pixel_qa']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA, 5,5, 'Cloud').eq(0);
// Return an image masking out cloudy areas.
};
// Second function to mask out cloudy pixels.
var clouds_mean = function(image) {
// Select the QA band.
var QA_mean = image.select(['pixel_qa_mean']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA_mean, 5,5, 'Cloud_mean').eq(0);
// Return an image masking out cloudy areas.
};
var maskClouds = function(image) {
var cs = cloud_shadows(image);
var c = clouds(image);
image = image.updateMask(cs);
return image.updateMask(c);
};
var maskClouds_mean = function(image) {
var cs_mean = cloud_shadows_mean(image);
var c_mean = clouds_mean(image);
image = image.updateMask(cs_mean);
return image.updateMask(c_mean);
};
////////////////////////////////////////////////////////////
/////////////////End Function///////////////////////////////
////////////////////////////////////////////////////////////
var mosaic_free = maskClouds(composite);
var mosaic_free_mean = maskClouds_mean(mean);
var visParams = {
bands: ['B4_mean', 'B3_mean', 'B2_mean'],
min: 0,
max: 3000,
gamma: 1.4,
};
var visParams2 = {
bands: ['B4', 'B3', 'B2'],
min: 0,
max: 3000,
gamma: 1.4,
};
Map.addLayer(mean, visParams, 'mean pixels');
Map.addLayer(composite, visParams2, 'With clouds');
Map.addLayer(mosaic_free, visParams2, 'Cloud free');
Map.addLayer(mosaic_free_mean, visParams, 'Cloud free mean');
Map.setCenter(-3.6985, 40.4157, 6);````