Sentinel-3 zarr products

OLCI Level-1

"https://common.s3.sbg.perf.cloud.ovh.net/eoproducts/S03OLCEFR_20230506T015316_0180_B117_T883.zarr.zip"
local_path = joinpath(tempdir(),OLCEFR)
Downloads.download(olci_path, local_path)
efr = open_datatree(local_path)
efr
πŸ“‚ root
β”œβ”€ πŸ“‚ conditions
β”œβ”€ β”œβ”€ πŸ“‚ geometry
β”œβ”€ β”œβ”€ πŸ“‚ image
β”œβ”€ β”œβ”€ πŸ“‚ instrument
β”œβ”€ β”œβ”€ πŸ“‚ meteorology
β”œβ”€ └─ πŸ“‚ orphans
β”œβ”€ πŸ“‚ measurements
β”œβ”€ └─ πŸ“‚ orphans
└─ πŸ“‚ quality
└─ └─ πŸ“‚ orphans

The product is represented by a hierarchical tree structure YAXTrees.YAXTree

Opening measurements data

rad = efr.measurements.oa01_radiance
rad
β”Œ 4865Γ—4092 YAXArray{Union{Missing, Float64}, 2} ┐
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ dims ┐
  ↓ columns Sampled{Int64} 1:4865 ForwardOrdered Regular Points,
  β†’ rows Sampled{Int64} 1:4092 ForwardOrdered Regular Points
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ metadata ─
  Dict{String, Any} with 12 entries:
  "long_name"     => "TOA radiance for OLCI acquisition band oa01"
  "scale_factor"  => 0.0136349
  "name"          => "oa01_radiance"
  "add_offset"    => 0.0
  "standard_name" => "toa_upwelling_spectral_radiance"
  "valid_min"     => 0
  "valid_max"     => 65534
  "coordinates"   => "time_stamp latitude longitude"
  "_FillValue"    => 0xffff
  "units"         => "mW.m-2.sr-1.nm-1"
  "short_name"    => "oa01_radiance"
  "missing_value" => 0xffff
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ loaded lazily ─
  data size: 151.88 MB
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The nodes of the YAXTree are YAXArrays.YAXArray or YAXArrays.Dataset

rad.data
4865Γ—4092 DiskArrayTools.CFDiskArray{Union{Missing, Float64}, 2, UInt16, Zarr.ZArray{UInt16, 2, Zarr.BloscCompressor, Zarr.ConsolidatedStore{Zarr.ZipStore{Vector{UInt8}}}}, Float64}

Chunked: (
    [1024, 1024, 1024, 1024, 769]
    [1024, 1024, 1024, 1020]
)

The underlying data is a CFDiskArray

Plot data

We use Makie.jl to plot the data.

lat=efr.measurements.latitude.data
lon=efr.measurements.longitude.data
val=replace(rad.data, missing => 0.0)

min,max = minimum(val), maximum(val)

fig=Figure(size=(1200,600))
ax1=Axis(fig[1, 1], title=rad.properties["long_name"],
     xlabel="Longitude", ylabel="Latitude")
s=surface!(ax1,lon, lat, zeros(size(lon));
     color=val,colorrange=(min,max),colormap=:rainbow, shading=NoShading)
     Colorbar(fig[1, 2], s)
ax2=Axis(fig[1, 3], title=rad.properties["long_name"],
     xlabel="Columns", ylabel="Rows")
heatmap!(ax2, val, colormap=:rainbow, colorrange=(min,max))
fig
Example block output

Open meteorological conditions

meteo = efr.conditions.meteorology
πŸ“‚ meteorology

Interpolate the atmospheric temperature at p=832.2 hPa

tp = linear_interpolation(meteo, "atmospheric_temperature_profile", dims="pressure_level", value=832.2)
fig=Figure(size=(800,600))
ax=Axis(fig[1, 1], title="atmospheric_temperature_profile @ 832.2 hPa",
     xlabel="tp_columns", ylabel="tp_rows")
heatmap!(ax,tp.data)
fig
Example block output

SLSTR Level-2 FRP

"https://common.s3.sbg.perf.cloud.ovh.net/eoproducts/S03SLSFRP_20200908T182648_0179_A298_S883.zarr.zip"
local_path = joinpath(tempdir(),SLSFRP)
Downloads.download(frp_path, local_path)
frp = open_datatree(local_path)
frp
πŸ“‚ root
β”œβ”€ πŸ“‚ conditions
β”œβ”€ β”œβ”€ πŸ“‚ geometry
β”œβ”€ β”œβ”€ πŸ“‚ meteorology
β”œβ”€ β”œβ”€ πŸ“‚ processing
β”œβ”€ β”œβ”€ β”œβ”€ πŸ“‚ fnadir
β”œβ”€ β”œβ”€ β”œβ”€ └─ πŸ“‚ orphan
β”œβ”€ β”œβ”€ └─ πŸ“‚ inadir
β”œβ”€ β”œβ”€ └─ └─ πŸ“‚ orphan
β”œβ”€ β”œβ”€ πŸ“‚ time_an
β”œβ”€ β”œβ”€ πŸ“‚ time_bn
β”œβ”€ └─ πŸ“‚ time_in
β”œβ”€ πŸ“‚ measurements
β”œβ”€ β”œβ”€ πŸ“‚ anadir
β”œβ”€ β”œβ”€ πŸ“‚ bnadir
β”œβ”€ β”œβ”€ πŸ“‚ fnadir
β”œβ”€ β”œβ”€ └─ πŸ“‚ orphan
β”œβ”€ └─ πŸ“‚ inadir
β”œβ”€ └─ └─ πŸ“‚ orphan
└─ πŸ“‚ quality
└─ β”œβ”€ πŸ“‚ fnadir
└─ └─ πŸ“‚ inadir

The product is represented by a hierarchical tree structure YAXTrees.YAXTree

Opening measurements data (1D)

meas = frp.measurements.inadir
meas
πŸ“‚ inadir
└─ πŸ“‚ orphan

Plot Active Fire Pixel on a Plate-CarrΓ©e grid

using CairoMakie, GeoMakie

frp_vals = Int64.(round.(frp.measurements.inadir.frp_mwir.data))
fig = Figure(size=(800,600))
ax = GeoAxis(fig[1,1]; dest = "+proj=merc")
GeoMakie.xlims!(ax, -125, -114)
GeoMakie.ylims!(ax, 40, 50)
lines!(ax, GeoMakie.coastlines(50), color=:black)
s=GeoMakie.scatter!(ax,
    frp.measurements.inadir.longitude.data,
    frp.measurements.inadir.latitude.data,
    color=frp_vals,
    colormap=:thermal,
    markersize=15,
    colorrange=(0, 100),
    )
Colorbar(fig[1,2],s, ticks=0:20:100)
fig
Example block output