如何在Google Earth Engine中基于均值缩减器创建无云图像?

时间:2019-10-02 09:16:19

标签: google-earth-engine

这让我发疯,但是我知道有一个非常简单的解决方案。

关于如何创建无云图像,在线上有很多东西,但是当我使用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);````

0 个答案:

没有答案