Какая функция подходит для маскировки облаков

Я писал функцию для маскировки облачных пикселей данных Sentinel-2.

Функция 1:

function cloudMask(image) {
  var qa = image.select('QA60');
  var cloudBitMask = 1 << 10; ###
  var cirrusBitMask = 1 << 11; ###
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(
             qa.bitwiseAnd(cirrusBitMask).eq(0));
  return image.updateMask(mask).divide(10000);
}

Функция 2:

function cloudMask(image) {
  var qa = image.select('QA60');
  var cloudBitMask = Math.pow(2, 10); ###
  var cirrusBitMask = Math.pow(2, 11); ###
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(
             qa.bitwiseAnd(cirrusBitMask).eq(0));
  return image.updateMask(mask).divide(10000);
}

Какая функция правильная? Разница между двумя функциями заключается в том, как определяются cloudBitMask и cirrusBitMask.


person Community    schedule 15.01.2019    source источник
comment
Вы их пробовали? Они оба работают, если да, то результаты выглядят по-разному?   -  person Val    schedule 15.01.2019


Ответы (1)


Обе функции верны, поскольку они делают одно и то же. Либо 1 << 10, либо Math.pow(2, 10) приведет к числу со значением 1024.

Поскольку мы обычно используем как непрозрачное облако, так и перистое облако для маскировки облаков, я предлагаю сделать код коротким и ясным, как показано ниже:

function cloudMask(image) {
    var qa = image.select('QA60');
    var allCloudBitMask = (1 << 10) + (1 << 11);
    var mask = qa.bitwiseAnd(allCloudBitMask).eq(0);
    return image.updateMask(mask);
}
person Kevin    schedule 25.01.2019