GEE中的位运算
本文参考:Working with QA Bands and Bitmasks in Google Earth Engine
下面书写的是我个人的理解,若有不对的地方,恳请您不吝赐教!
了解过MODIS产品数据后发现,它有一个QA波段用来标记其他波段的质量情况。下面用比较常用的MOD13Q1[波段信息]举例:两个QA波段,SummaryQA和DetailedQA。从BitMask详细信息中可以看出,DetailedQA是16-bits的数据类型,表示它的取值范围为\([0,2^{16}-1]\),即在0到65535之间。而从DetailQA到BitMask,可以看下面这个流程图。

所以,想要获得质量较高的NDVI图像,需要满足'SummaryQA' bit0-1为0 or 'DetailQA'bit0-1为0 or ('DetailQA'bit0-1为1 and 'DetailQA'bit2-5为0)


function bitwiseExtract(value, fromBit, toBit) {
if (toBit === undefined) toBit = fromBit
var maskSize = ee.Number(1).add(toBit).subtract(fromBit)
var mask = ee.Number(1).leftShift(maskSize).subtract(1)
return value.rightShift(fromBit).bitwiseAnd(mask)
}
var modisQA_mask = function(image) {
var sqa = image.select('SummaryQA');
var dqa = image.select('DetailedQA');
var viQualityFlagsS = bitwiseExtract(sqa, 0, 1);
var viQualityFlagsD = bitwiseExtract(dqa, 0, 1);
var viUsefulnessFlagsD = bitwiseExtract(dqa, 2, 5);
var mask = viQualityFlagsS.eq(0) // Good data, use with confidence
.or(viQualityFlagsD.eq(0)) // VI produced with good quality
.or(viQualityFlagsD.eq(1).and(viQualityFlagsD.eq(0)));// VI produced, but check other QA & VI usefulness: Highest quality
// var mask = viQualityFlagsS.eq(0) // Good data, use with confidence
// .and(viQualityFlagsD.eq(0)) // VI produced with good quality
return image.updateMask(mask);
};
另一个是采用按位与的运算,参见官方给出的Landsat去云代码
参考说明见:GEE|Google Earth Engine中的位运算 - Weltㅤ - 博客园 (cnblogs.com)
关键是理解这句话:第二步中,只有'XXXX XXXX XXX0 0000'(X代表0或1)这样的像素,在进行按位与运算后的结果为0,最终的结果为1。
而bit0-4全是0,对应属性表格。
