Source code for polar2grid.composites.enhanced

#!/usr/bin/env python
# encoding: utf-8
# Copyright (C) 2021 Space Science and Engineering Center (SSEC),
#  University of Wisconsin-Madison.
#
#     This program is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 3 of the License, or
#     (at your option) any later version.
#
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# This file is part of the polar2grid software package. Polar2grid takes
# satellite observation data, remaps it, and writes it to a file format for
# input into another program.
# Documentation: http://www.ssec.wisc.edu/software/polar2grid/
"""Composites that apply enhancements during the compositing phase."""

from satpy.composites import SingleBandCompositor, enhance2dataset


[docs]class SingleEnhancedBandCompositor(SingleBandCompositor): """Produce a pre-enhanced version of the single provided dependency. .. warning:: This does **NOT** stop Satpy from enhancing this dataset again. The metadata provided to this compositor must make the DataArray match another "no-op" enhancement on the backend. """ def __call__(self, projectables, nonprojectables=None, **attrs): """Build the composite.""" if len(projectables) != 1: raise ValueError("Can't have more than one band in a single-band composite") data = projectables[0] new_attrs = data.attrs.copy() data = enhance2dataset(data) data.attrs = new_attrs if isinstance(data.attrs.get("sensor"), set) and len(data.attrs["sensor"]) == 1: data.attrs["sensor"] = list(data.attrs["sensor"])[0] return super().__call__([data], **attrs)
[docs]class SubBandCompositor(SingleBandCompositor): """Get a single band from a provided multi-band DataArray.""" def __init__(self, name, prerequisites=None, optional_prerequisites=None, band_index=None, **kwargs): super().__init__(name, prerequisites=prerequisites, optional_prerequisites=optional_prerequisites, **kwargs) if band_index is None: raise ValueError("'band_index' must be provided.") self._band_index = band_index def __call__(self, projectables, nonprojectables=None, **attrs): """Index the provided DataArray and create a single band composite from it.""" if len(projectables) != 1: raise ValueError("Can't have more than one band in a single-band composite") data = projectables[0] if "bands" not in data.dims: raise ValueError("Provided data has no 'bands' dimension.") band_index = self._band_index if isinstance(band_index, int): band_index = data.dims["bands"][band_index] data = data.sel(bands=band_index) return super().__call__([data], **attrs)