Total Ozone Column over snow in Antarctica

function setup() {
  return {
    input: [
      "sunZenithAngles",
      "viewZenithMean",
      "B01",
      "B03",
      "B8A",
      "dataMask",
    ],
    output: { bands: 4, sampleType: "AUTO" },
  };
}

// Constants
// Make a visualisation based on the preset colour ramp
const visualizer = ColorRampVisualizer.createRedTemperature(140, 340);
// ac is a constant from Table 2
const ac = 3.49e-2;
// ab and cAbsB are constants from Table 2
const ab = 7.48e-4;
const cAbsB = 3.87e-21;

function degrees_to_radians(degrees) {
  // Convert degrees to radians
  return degrees * (Math.PI / 180);
}

function amf(sza, vza) {
  // Compute the air mass factor (AMF)
  // sza in radians
  // vza in radians

  let epsilon = Math.cos(sza);
  let eta = Math.cos(vza);

  // Calculate AMF
  let m = 1 / epsilon + 1 / eta;

  return m;
}

function calcK(reflA, reflB, L) {
  // Compute K from Eq. 5
  let K = (Math.log(reflA / reflB) - Math.sqrt(ab * L)) / cAbsB;

  return K;
}

function calcL(reflA, reflC) {
  // Compute L from Eq. 5
  let L = Math.pow(Math.log(reflC / reflA), 2) / ac;

  return L;
}

function compute_ozone(sza, vza, reflA, reflB, reflC) {
  // Compute air mass factor
  let szaRad = degrees_to_radians(sza);
  let vzaRad = degrees_to_radians(vza);
  let m = amf(szaRad, vzaRad);

  // Compute L
  let L = calcL(reflA, reflC);

  // Compute K
  let K = calcK(reflA, reflB, L);

  // Compute ozone
  let N = K / m;

  return N;
}

function evaluatePixel(sample) {
  // Define bands
  var SZA = sample.sunZenithAngles;
  var VZA = sample.viewZenithMean;

  // Set bands and wavelengths in cm
  var reflA = sample.B01;
  var reflB = sample.B03;
  var reflC = sample.B8A;

  // Compute ozone
  let ozoneCol = compute_ozone(SZA, VZA, reflA, reflB, reflC);

  // Convert ozone from mol/cm2 to DU
  let k = 3.722 * Math.pow(10, -17);
  let ozoneDu = ozoneCol * k;

  // Visualisation
  let rgbVis = visualizer.process(ozoneDu);

  return rgbVis.concat(sample.dataMask);
}

Evaluate and Visualize

General description of the script

Kokhanovsky et al. 2021 propose a simple algorithm to derive the Total Ozone Column and snow properties (spectral albedo and effective light absorption path) from Sentinel-2 L1C measurements over Antarctica. This script is an implementation of the algorithm that calculates the Total Ozone Column over highly-reflective surfaces located beneath a clean Antarctic atmosphere. The algorithm uses reflectance in the spectral range 443–865 nm, more particularly band 3 (559.8 nm) where ozone absorption is subtantial, band 8A (864.7 nm) where ice absorption is high, and band 1 (442.7 nm) where ice and ozone absorption are minimal, to calculate the K parameter which is correlated to the Total Ozone Column.

The authors validated the results of the algorithm at DOME C (Antarctica) between November and December 2020 against multiple other satellite and ground-based sensors. The algorithm was shown to perform in a similar manner to existing products, as shown in Figure 1 below. More details about the validation process and the interpretation of the results can be found in Kokhanovsky et al. 2021.

validation Figure 1: Validation results of the Total Ozone Column retrieval algorithm compared to other satellite and ground-based sensors. Source: Figure 2 from Kokhanovsky et al. 2021.

The Evalscript is currently designed to display Ozone Values in Dobson Units (DU), with values between 140 and 340 DU being stretched over the 0-255 display range. To return the actual Ozone values, please return the variable ozoneDu, setting the sampleType to FLOAT32. For values in cm2/molecule, return the variable ozoneCol in your Evalscript.

Note that the script requires Sentinel-2 L1C images to function correctly and will not work with L2A products. For further information about the areas of application and limitations of the algorithm, please refer to Kokhanovsky et al. 2021.

Description of representative images

Total Column retrieval from a Sentinel-2 L1C image acquired over Dome C, Antarctica on 8th February 2021. On that date, the Total Ozone Column was uniform over the area. Interestingly, the algorithm not being designed to retrieve values over built-up structures highlights the research station quite well! The average Total Ozone Column (excluding the research station) is 296 DU in this figure.

ozone

References

The script was based on the analytical equations presented in the following scientific article:

Kokhanovsky, Alexander, Simon Gascoin, Laurent Arnaud, and Ghislain Picard. 2021. “Retrieval of Snow Albedo and Total Ozone Column from Single-View MSI/S-2 Spectral Reflectance Measurements over Antarctica” Remote Sensing 13, no. 21: 4404. https://doi.org/10.3390/rs13214404