QA с разными битами в GEE - PullRequest
       14

QA с разными битами в GEE

1 голос
/ 07 марта 2019

У меня возникла проблема с выбором данных хорошего качества для продукта с прожженной поверхностью MCD64A1. Здесь , это описание диапазона QA, но я действительно запутался с различными битами.

Что я хочу сделать, это выбрать все наблюдения хорошего качества на суше и замаскировать коллекцию на их основе.У меня есть следующее, но это не правильный способ сделать это.

Я ценю любую помощь.

    var geometry = /* color: #d63000 */ee.Geometry.Polygon(
            [[[23.821277851635955, 46.07285332090363],
              [23.274708027417205, 45.952681148559265],
              [24.11378883796408, 45.554067690813184],
              [24.89381813483908, 45.84372892769175],
              [24.17146706062033, 46.25167241706428]]]);
    var dataset = ee.ImageCollection('MODIS/006/MCD64A1')
                      .filterBounds(geometry)
        .map(function(image){return image.clip(geometry)}) 
                          .filter(ee.Filter.calendarRange(7,7,'month'));
    var burnedArea = dataset.select('BurnDate','QA');

//good quality observations

var good= (function(img) {
  var goodQA = img.select("QA").eq(1); 
  return img.updateMask(burnedArea .and(goodQA));
});

РЕДАКТИРОВАТЬ

Кроме того, я пробовал следующее, которое не дает мне ошибки, но также и никаких данных.

var good= function(img){  
  var qa = img.select(['QA']);
  var mask = qa.bitwiseAnd(0).eq(1).and( 
             qa.bitwiseAnd(1).eq(1)).and( 
             qa.bitwiseAnd(2).eq(1)); 
  return img.updateMask(mask);
};

1 Ответ

1 голос
/ 12 марта 2019

Я думаю, что этот код может удовлетворить ваши потребности:

var good = function(img) {
    var qa = img.select(['QA']);
    var mask = qa.bitwiseAnd(3).eq(3);
    return img.updateMask(mask);
}
burnedArea = burnedArea.map(good);

По сути, этот код просто изменяет строку var mask = ... из вашего отредактированного кода. После строки burnedArea = burnedArea.map(good); ваша переменная burnedArea будет отображать только те пиксели, которые в полосе QA имеют "значение 0 бита 1 и значение 1 бита 1".

Поскольку число 3 имеет двоичную форму 11 (значение бита 0 1 и значение 1 бита 1), то, что делает qa.bitwiseAnd(3), превращает любой пиксель в полосе QA в одно из четырех значений:

  • значение 3, если QA пиксель имеет «бит 0, значение 1 и бит 1, значение 1» (например, 3, 7, 11, 15 и т. Д.)

  • значение 2, если QA пиксель имеет «бит 0, значение 0 и бит 1, значение 1» (например, 2, 6, 10 и т. Д.)

  • значение 1, если QA пиксель имеет «бит 0, значение 1 и бит 1, значение 0» (например, 1, 5, 9 и т. Д.)

  • значение 0, если QA пиксель имеет «бит 0, значение 0 и бит 1, значение 0» (например, 0, 4, 8 и т. Д.)

Часть .eq(3), как вы, возможно, уже знаете, преобразует пиксели со значением 3 в 1, а остальные в 0.

Надеюсь, это прояснит ваше замешательство по поводу "битов".

...