Skip to content

Sentinel-2 View/Sun Angle Bands

Sentinel-2 L2A view and sun geometry — viewZenithMean, viewAzimuthMean, sunZenithAngles, sunAzimuthAngles, the band names SentinelHub-style eval scripts use — are ordinary cube bands. load_collection can request any of them directly, the same way Sentinel-1's calibration and noise bands can.

Where the values come from

None of this data is virtual: it comes from MTD_TL.xml, the per-granule tile metadata file every Sentinel-2 product ships alongside its raster bands, published as a STAC asset (granule_metadata on CDSE and Earth Search, granule-metadata on Planetary Computer).

Band Source Shape
viewZenithMean Mean, across all 13 Sentinel-2 bands, of Mean_Viewing_Incidence_Angle_List's per-band ZENITH_ANGLE scalar, uniform across the scene
viewAzimuthMean Circular mean, across all 13 bands, of the same list's AZIMUTH_ANGLE scalar, uniform across the scene
sunZenithAngles Sun_Angles_Grid/Zenith, a real 23×23 grid at 5000 m spacing per-pixel, bilinearly interpolated
sunAzimuthAngles Sun_Angles_Grid/Azimuth per-pixel, bilinearly interpolated

The "Mean" bands are genuinely scalar — that's what the source data itself is (one measurement per band, not per pixel), matching their name. The sun angle bands are genuinely spatially resolved: sun position varies smoothly but measurably across a 110 km tile, and the real grid captures that instead of a flat approximation.

Supported collections

sentinel-2-l2a is served from CDSE, Earth Search and Planetary Computer. Any STAC catalogue configured for this backend works the same way, as long as its items expose a granule_metadata or granule-metadata asset (application/xml, role metadata) pointing at the item's MTD_TL.xml.

Planetary Computer is not currently supported for reading these bands. Discovery still advertises them (/collections/sentinel-2-l2a lists all four, honestly, since the STAC contract doesn't distinguish "advertised" from "readable"), but a live, unauthenticated fetch of PC's granule-metadata asset returns HTTP 409 PublicAccessNotPermitted — requesting one of these bands against a PC-backed deployment fails with a clear fetch error, not a wrong value. See ADR 0004 §3.1 for the evidence and status.

Worked example

Sun zenith angle alongside the red band, for a scene-level illumination check:

{
  "process_graph": {
    "load1": {
      "process_id": "load_collection",
      "arguments": {
        "id": "sentinel-2-l2a",
        "spatial_extent": {"west": -1.5, "south": 62.0, "east": -1.0, "north": 62.3},
        "temporal_extent": ["2026-08-07T00:00:00Z", "2026-08-08T00:00:00Z"],
        "bands": ["B04_10m", "sunZenithAngles"]
      }
    },
    "save1": {
      "process_id": "save_result",
      "arguments": {
        "data": {"from_node": "load1"},
        "format": "GTiff"
      },
      "result": true
    }
  }
}

Band names for the raster bands follow each catalogue's own convention (B04_10m on CDSE, red on Earth Search, B04 on Planetary Computer) — the four angle band names above are the same across all three.

Design reference

The full evidence, mechanism and open limitations are documented in ADR 0004, which extends the band-sources mechanism ADR 0002 built for Sentinel-1. ADRs are repo-only documentation (like docs/audits/) and are not published on this site — follow the links on GitHub.