Source code for geestac.image

"""Module to handle Image Datasets."""

from typing import Union

from .bands import Band, Bit, BitBand, BitGroup, Bitmask, CategoricalBand, Category, OpticalBand
from .custom_types import ListNamespace
from .dataset import Dataset


[docs] class Image(Dataset): def __init__(self, href: str, name: str, parent): """Image Dataset.""" super(Image, self).__init__(href=href, name=name, parent=parent)
[docs] self._bands: ListNamespace[Union[Band, BitBand, CategoricalBand, OpticalBand]] = ( ListNamespace(key="name") )
@property
[docs] def bands(self) -> ListNamespace[Union[Band, BitBand, CategoricalBand, OpticalBand]]: """Image bands.""" if len(self._bands) == 0: bands = [] summ = self._get_summaries() eobands = summ.get("eo:bands", []) general_scale = summ.get("gsd") b: Union[Band, BitBand, CategoricalBand, OpticalBand] # Explicit type hint for 'b' if isinstance(general_scale, (list, tuple)): # TODO: check/investigate why it's a list and what happens if it has more than 1 item general_scale = general_scale[0] for band in eobands: name = band.get("name") scale = band.get("gsd", general_scale) desc = band.get("description") range = self._get_summaries().get(name, {}) if "gee:wavelength" in band or "center_wavelength" in band: # OpticalBand center_wl = band.get("center_wavelength") offset = band.get("offset", 0) multiplier = band.get("scale", 0) b = OpticalBand(name, scale, desc, center_wl, offset, multiplier, range) elif "gee:classes" in band: # CategoricalBand classes = band.get("gee:classes") cat_list = [] for cls in classes: cat = Category(cls["value"], cls["description"], cls.get("color")) cat_list.append(cat) class_info = ListNamespace(*cat_list, key="description") b = CategoricalBand(name, scale, desc, class_info) elif "gee:bitmask" in band: # BitBand bitmask_raw = band.get("gee:bitmask") parts = bitmask_raw["bitmask_parts"] bit_groups = [] for part in parts: bits = [] values = part.get("values") if not values: continue for value in values: bit = Bit(value["value"], value["description"]) bits.append(bit) bitsns = ListNamespace(*bits, key="description") group = BitGroup( part["first_bit"], part["bit_count"], part["description"], bitsns ) bit_groups.append(group) partsns = ListNamespace(*bit_groups, key="description") bitmask = Bitmask(partsns, bitmask_raw["total_bit_count"]) b = BitBand(name, scale, desc, bitmask) else: b = Band(name, scale, desc, range) bands.append(b) self._bands = ListNamespace(*bands, key="name") return self._bands