Source code for eoio.readers.radcalnet.metadata

"""
eoio.readers.radcalnet.metadata
==============================

Metadata extraction utilities for RadCalNet datasets.

Functions
---------
.. autosummary::
   :toctree: generated/

   get_product_metadata
   get_variable_metadata
   get_basic_metadata
"""

import xarray as xr
from eoio.readers.base import BaseReader
from eoio.readers.metadata import BaseMetadataExtractor
from eoio.readers.footprint_utils import normalize_footprint

ROI_DEFINITIONS = {
    "BSCN": 300,
    "BTCN": 10,
    "GSCN": 1000,
    "GONA": 500,
    "GHNA": 500,
    "LCFR": 60,
    "RVUS": 1000,
    "ERUS": 130,
}

min_basic_var_metadata_keys = [
    "long_name",
    "standard_name",
    "units",
]

optional_basic_var_metadata_keys = [
    "history",
    "_FillValue",
    "unc_comps",
    "err_corr_1_dim",
    "err_corr_1_form",
    "err_corr_1_units",
    "err_corr_1_params",
    "err_corr_2_dim",
    "err_corr_2_form",
    "err_corr_2_units",
    "err_corr_2_params",
    "pdf_shape",
    "add_offset",
    "scale_factor",
    "flag_meanings",
    "flag_masks",
]


[docs] class RadCalNetMetadataExtractor(BaseMetadataExtractor): def __init__(self, reader: BaseReader, ds: xr.Dataset): super().__init__(reader) self.ds = ds.copy() self.subset = reader.config.subset
[docs] def get_product_metadata(self) -> dict: """ Extract product metadata from the dataset. :returns: Product metadata dictionary. """ md = self.ds.attrs.copy() return md
[docs] def get_variable_metadata(self, var: str) -> dict: """ Extract variable metadata from the dataset. :param var: Variable name. :returns: Variable metadata dictionary. """ var_md = self.ds[var].attrs.copy() for key in optional_basic_var_metadata_keys: var_md.pop(key, None) for key in min_basic_var_metadata_keys: var_md.pop(key, None) return var_md
[docs] def get_variable_basic_metadata(self, var: str) -> dict: """ Extract variable metadata from the dataset. :param var: Variable name. :returns: Variable metadata dictionary. """ var_md = {} for key in min_basic_var_metadata_keys: if key in self.ds[var].attrs: var_md[key] = self.ds[var].attrs[key] else: Warning(f"Variable {var} missing expected metadata key: {key}") var_md[key] = "" for key in optional_basic_var_metadata_keys: if key in self.ds[var].attrs: var_md[key] = self.ds[var].attrs[key] return var_md
[docs] def get_basic_metadata(self) -> dict: """ Extract basic metadata from the dataset, to be used in other tools in MetEOR. :returns: Basic metadata dictionary. """ from dateutil import parser lat = self.ds.attrs["Lattitude"] lon = self.ds.attrs["Longitude"] name = self.ds.attrs["Site"][0][0:4] basic_md = { "collection_name": f"{name} {self.ds.attrs['collection']}", "product_name": f"{name}_RadCalNet_L1", "platform": "RadCalNet", "name": self.ds.attrs["Site"], "processing_level": "L1", "spatial_resolution": "30 m disk", "geometry_ids": "insitu", "product_bounds": f"{ROI_DEFINITIONS[name]} ({lon} {lat})", "product_date": parser.parse(str(self.ds.time.values[0])).date(), "description": "TBD", "eoio:reader": "radcalnet", "eoio:subset": repr(self.subset), "footprint": normalize_footprint( geometry_input=f"POINT ({lon} {lat})", crs_input=4326, # RadCalNet uses WGS84 (EPSG:4326) coordinates ), } return basic_md