Source code for geoips.plugins.classes.readers.smap_remss_winds_netcdf

# # # This source code is subject to the license referenced at
# # # https://github.com/NRLMMD-GEOIPS.

"""Read derived surface winds from REMSS SMAP netcdf data."""

from geoips.interfaces.class_based.readers import BaseReaderPlugin

# Python Standard Libraries
import logging
from os.path import basename

# Third-Party Libraries
import xarray

# GeoIPS imports
from geoips.plugins.classes.readers.utils.remss_reader import (
    read_remss_data,
)

from geoips.xarray_utils.time import (
    get_min_from_xarray_time,
    get_max_from_xarray_time,
)

LOG = logging.getLogger(__name__)


[docs]class SmapRemssWindsNetcdfReaderPlugin(BaseReaderPlugin): """Smap Remss Winds Netcdf reader plugin class.""" interface = "readers" family = "standard" name = "smap_remss_winds_netcdf" MS_TO_KTS = 1.94384 DEG_TO_KM = 111.321 source_names = ["smap-spd"]
[docs] def call( self, fnames, metadata_only=False, chans=None, area_def=None, self_register=False, ): """Read one of SMAP derived winds from netcdf data. Parameters ---------- fnames : list * List of strings, full paths to files metadata_only : bool, default=False * NOT YET IMPLEMENTED * Return before actually reading data if True chans : list of str, default=None * NOT YET IMPLEMENTED * List of desired channels (skip unneeded variables as needed). * Include all channels if None. area_def : pyresample.AreaDefinition, default=None * NOT YET IMPLEMENTED * Specify region to read * Read all data if None. self_register : str or bool, default=False * NOT YET IMPLEMENTED * register all data to the specified dataset id (as specified in the return dictionary keys). * Read multiple resolutions of data if False. Returns ------- dict of xarray.Datasets * dictionary of xarray.Dataset objects with required Variables and Attributes. * Dictionary keys can be any descriptive dataset ids. See Also -------- :ref:`xarray_standards` Additional information regarding required attributes and variables for GeoIPS-formatted xarray Datasets. """ # Only SAR reads multiple files fname = fnames[0] wind_xarray = xarray.open_dataset(str(fname), decode_times=False) wind_xarray.attrs["source_name"] = "smap-spd" wind_xarray.attrs["platform_name"] = "smap" wind_xarray.attrs["data_provider"] = "rss" wind_xarray.attrs["source_file_names"] = [basename(fname)] wind_xarray.attrs["interpolation_radius_of_influence"] = 20000 wind_xarray.attrs["sample_distance_km"] = self.DEG_TO_KM / 4 wind_xarray.attrs["minimum_coverage"] = 20 LOG.info("Read data from %s", fname) if ( hasattr(wind_xarray, "institution") and "Remote Sensing Systems" in wind_xarray.institution ): if hasattr(wind_xarray, "title") and "SMAP" in wind_xarray.title: wind_xarrays = read_remss_data(wind_xarray, "smap") for wind_xarray in wind_xarrays.values(): LOG.info("Setting standard metadata") wind_xarray.attrs["start_datetime"] = get_min_from_xarray_time( wind_xarray, "time" ) wind_xarray.attrs["end_datetime"] = get_max_from_xarray_time( wind_xarray, "time" ) if "wind_speed_kts" in wind_xarray.variables: # These text files store wind speeds natively in kts wind_xarray["wind_speed_kts"].attrs["units"] = "kts" LOG.info( "Read data %s start_dt %s source %s platform %s data_provider %s roi " "%s native resolution", wind_xarray.attrs["start_datetime"], wind_xarray.attrs["source_name"], wind_xarray.attrs["platform_name"], wind_xarray.attrs["data_provider"], wind_xarray.attrs["interpolation_radius_of_influence"], wind_xarray.attrs["sample_distance_km"], ) wind_xarrays["METADATA"] = wind_xarray[[]] return wind_xarrays
PLUGIN_CLASS = SmapRemssWindsNetcdfReaderPlugin