Как создать бесплатное изображение без облаков в Google Earth Engine? - PullRequest
0 голосов
/ 02 октября 2019

Это сводит меня с ума, но я знаю, что есть очень простое решение для этого.

Есть много вещей в Интернете о том, как создавать безоблачные изображения, но когда я использую 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);````
...