这让我发疯,但是我知道有一个非常简单的解决方案。
关于如何创建无云图像,在线上有很多东西,但是当我使用MEAN reducer并尝试显示输出时,出现错误:
无云均值:层错误:Image.bitwiseAnd:按位操作数只能是整数。
我认为此错误是由于数据类型引起的,类似于此处发布的问题: https://gis.stackexchange.com/questions/337234/applying-a-cloud-mask-to-a-gap-filled-landsat-7-slc-off-image
但是,当我尝试更改数据类型时,出现了根本没有意义的错误:
平均值= Array.int16(平均值) 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);````