Land Surface Temperature Quality Flags

//VERSION=3

const bits_to_check = [8, 9, 11, 13, 14, 15]; // Bits to check if they are set
const sensing_time = "0130"; // "0130" or "1330" or ""

function setup() {
  return {
    input: ["QF", "dataMask"],
    output: { id: "default", bands: 4 },
    mosaicking: "TILE",
  };
}

//Select files based on sensing time (0130 or 1330)
function preProcessScenes(collections) {
  collections.scenes.tiles = collections.scenes.tiles.filter(function (tile) {
    return tile.dataPath.includes("T" + sensing_time);
  });
  collections.scenes.tiles.sort((a, b) => new Date(b.date) - new Date(a.date));
  return collections;
}

function areBitsSet(qf) {
  // Check if the bits are set
  for (let idx in bits_to_check) {
    const bit = 1 << (bits_to_check[idx] - 1);
    if ((qf & bit) !== 0) {
      return true;
    }
  }
  return false;
}

function evaluatePixel(sample) {
  // When there are no dates, return no data
  if (sample.length == 0) return [NaN, NaN, NaN, 0];

  // Return NaN for no data pixels
  if (sample[0].dataMask == 0) {
    return [NaN, NaN, NaN, 0];
  }

  // Check if the bits are set
  const bit_set = areBitsSet(sample[0].QF);

  // Ensure only flagged pixels are displayed
  let opacity = 0;
  let imgVals = [1, 0, 0];
  if (bit_set) {
    opacity = 0.5;
  }

  return [...imgVals, opacity];
}
//VERSION=3

const bits_to_check = [8, 9, 11, 13, 14, 15]; // Bits to check if they are set
const sensing_time = "0130"; // "0130" or "1330" or ""

function setup() {
  return {
    input: ["QF", "dataMask"],
    output: { bands: 1, sampleType: "UINT8" },
    mosaicking: "TILE",
  };
}

//Select files based on sensing time (0130 or 1330)
function preProcessScenes(collections) {
  collections.scenes.tiles = collections.scenes.tiles.filter(function (tile) {
    return tile.dataPath.includes("T" + sensing_time);
  });
  collections.scenes.tiles.sort((a, b) => new Date(b.date) - new Date(a.date));
  return collections;
}

function areBitsSet(qf) {
  // Check if the bits are set
  for (let idx in bits_to_check) {
    const bit = 1 << (bits_to_check[idx] - 1);
    if ((qf & bit) !== 0) {
      return true;
    }
  }
  return false;
}

function evaluatePixel(sample) {
  // When there are no dates, return no data
  if (sample.length == 0) return [NaN];

  // Return NaN for no data pixels
  if (sample[0].dataMask == 0) {
    return [NaN];
  }

  // Check if the bits are set
  const bit_set = areBitsSet(sample[0].QF);

  return [bit_set ? 1 : 0];
}

Evaluate and Visualize

General description

Land Surface Temperature (LST) products include quality flag assets that provide quality metadata for each pixel using a bitwise flag system. These flags help identify the reliability of the LST values for each pixel. Here we show how these quality flags can be easily displayed using custom scripts. For a complete list of all possible quality flags and their corresponding bits, please refer to these tables.

Notes on usage

Users can customize the script by adding the bit numbers corresponding to the quality flag(s) of interest to the bits_to_check list within the script. By default, the provided scripts are set to check all critical flags (indicating unreliable data, with corresponding LST pixels set to the no data value), but this can be updated to include or exclude specific flags as needed.

Planet’s LST product provides near real-time measurements twice a day at 1:30 and 13:30 solar local time. The sensing_time variable in the scripts can be used to select the sensing time of interest

The provided Visualization script highlights pixels for which specific quality flags of interest are set. This allows users to visually inspect areas of concern or interest.

The Raw Values script retrieves a binary raster where:

  • 1 indicates pixels for which the quality flag(s) of interest are set
  • 0 indicates pixels where the quality flag(s) of interest are not set

Description of representative images

The ‘Open water’ (bit 15) quality flag in Flevoland, The Netherlands, on 2022-12-31.

The water quality flag