Load Data from the eodc STAC catalogue into Xarray

try:
    from odc import stac as odc_stac
except ImportError:
    %pip install odc-stac
    from odc import stac as odc_stac

try:
    from netCDF4 import Dataset
except ImportError:
    %pip install netCDF4
    from netCDF4 import Dataset

import xarray as xr
import matplotlib.pyplot as plt

from pystac_client import Client

import os
from datetime import datetime

import numpy as np

Access the catalog and desired collection

First we load the data, we want to load as a Xarray. This is described in the Data Discorvery Notebook.

eodc_catalog = Client.open(
    "https://stac.eodc.eu/api/v1",
)
time_range = "2024-03-01/2024-05-01"

# Bounding box of Austria
bbox_aut = [9.25, 46.31, 17.46, 49.18]
search = eodc_catalog.search(
    collections=["SENTINEL2_L1C"],
    bbox = bbox_aut,
    datetime=time_range
)

print("We found ", search.matched(), " items, that match our filter criteria.")

items = search.items()
We found  14  items, that match our filter criteria.

Specify Dataset parameters and load into Xarray

crs = "EPSG:4312"
res = 0.00018 # 20 meters in degree 
bands = ["red", "nir"]
#This step can take time
print ("loading data started  : ", datetime.now())
ds = odc_stac.load(items,
                    crs=crs,
                    resolution=res,
                    bbox=bbox_aut,
                    bands = bands,
                       )
print ("loading data completed: ", datetime.now())
loading data started  :  2024-07-04 13:19:36.876273
loading data completed:  2024-07-04 13:49:39.271929

Save results as netCDF

ds.to_netcdf("./data/stac_xarray.nc")

Load netCDF

Open the saved NetCDF file.

nc_file = xr.open_dataset("./data/stac_xarray.nc")
red = nc_file['red']
nir = nc_file['nir']
def normalized_difference(x, y):
    nd = (x - y) / (x + y)
    return nd
ndvi = normalized_difference(nir, red)

Plot the NetCDF Data

Select data for a specific time step and create a plot.

time_data = ndvi.isel(time = 0)
p = plt.imshow(time_data, vmin = -1,  vmax = 1, cmap = "inferno")
plt.colorbar(p)
plt.xlabel("Longitude")
plt.ylabel("Latitude")
plt.title("NetCDF Data NDVI")
plt.show()

To create different plots, you need to run the notebook yourself.