Source code for sentinelhub.data_collections_bands
"""Contains information about data collections used by SH"""
from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
import numpy as np
[docs]class Unit(Enum):
"""Collection of all units used by Sentinel Hub"""
DN = "DN"
PPB = "PPB"
INDEX = "INDEX"
KELVIN = "KELVIN"
METERS = "METERS"
MOL_M2 = "MOL_M2"
KG_M2 = "KG_M2"
DEGREES = "DEGREES"
PASCALS = "PASCALS"
PERCENT = "PERCENT"
FRACTION = "FRACTION"
RADIANCE = "RADIANCE"
KILOMETERS = "KILOMETERS"
REFLECTANCE = "REFLECTANCE"
LINEAR_POWER = "LINEAR_POWER"
OPTICAL_DEPTH = "OPTICAL_DEPTH"
BRIGHTNESS_TEMPERATURE = "BRIGHTNESS_TEMPERATURE"
SURFACE_TEMPERATURE = "SURFACE_TEMPERATURE"
HECTOPASCALS = "HECTOPASCALS"
[docs]@dataclass(frozen=True)
class Band:
"""Information about a band available in a collection
Units and output types need to have the same order i.e. the unit at position 2 has to match the output type
at position 2. The unit (and output type) at position 0 is considered the default.
"""
name: str
units: tuple[Unit, ...]
output_types: tuple[type, ...]
[docs]class Bands:
"""
Different collections of bands taken from `Sentinel Hub docs <https://docs.sentinel-hub.com/api/latest/data/>`__
"""
SENTINEL1_IW = (
Band("VV", (Unit.LINEAR_POWER,), (np.float32,)),
Band("VH", (Unit.LINEAR_POWER,), (np.float32,)),
)
SENTINEL1_EW = (
Band("HH", (Unit.LINEAR_POWER,), (np.float32,)),
Band("HV", (Unit.LINEAR_POWER,), (np.float32,)),
)
SENTINEL1_EW_SH = (Band("HH", (Unit.LINEAR_POWER,), (np.float32,)),)
SENTINEL2_L1C = tuple(
Band(name, (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16))
for name in ["B01", "B02", "B03", "B04", "B05", "B06", "B07", "B08", "B8A", "B09", "B10", "B11", "B12"]
)
SENTINEL2_L2A = tuple(
Band(name, (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16))
for name in ["B01", "B02", "B03", "B04", "B05", "B06", "B07", "B08", "B8A", "B09", "B11", "B12"]
)
SENTINEL3_OLCI = tuple(
Band(f"B{str(index).zfill(2)}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 22)
)
SENTINEL3_SLSTR = (
*(Band(f"S{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 7)),
*(Band(name, (Unit.BRIGHTNESS_TEMPERATURE,), (np.float32,)) for name in ["S7", "S8", "S9", "F1", "F2"]),
)
SENTINEL5P = (
*(Band(name, (Unit.DN,), (np.float32,)) for name in ["CO", "HCHO", "NO2", "O3", "SO2"]),
Band("CH4", (Unit.PPB,), (np.float32,)),
*(Band(name, (Unit.INDEX,), (np.float32,)) for name in ["AER_AI_340_380", "AER_AI_354_388"]),
*(Band(name, (Unit.PASCALS,), (np.float32,)) for name in ["CLOUD_BASE_PRESSURE", "CLOUD_TOP_PRESSURE"]),
*(Band(name, (Unit.METERS,), (np.float32,)) for name in ["CLOUD_BASE_HEIGHT", "CLOUD_TOP_HEIGHT"]),
Band("CLOUD_OPTICAL_THICKNESS", (Unit.OPTICAL_DEPTH,), (np.float32,)),
Band("CLOUD_FRACTION", (Unit.FRACTION,), (np.float32,)),
)
LANDSAT_OT_L1 = (
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 10)),
*(Band(f"B{index}", (Unit.BRIGHTNESS_TEMPERATURE,), (np.float32,)) for index in [10, 11]),
)
LANDSAT_OT_L2 = (
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 8)),
Band("B10", (Unit.SURFACE_TEMPERATURE,), (np.float32,)),
)
LANDSAT_ETM_L1 = (
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 6)),
*(Band(f"B06_VCID_{subindex}", (Unit.BRIGHTNESS_TEMPERATURE,), (np.float32,)) for subindex in [1, 2]),
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in [7, 8]),
)
LANDSAT_ETM_L2 = (
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 6)),
Band("B06", (Unit.SURFACE_TEMPERATURE,), (np.float32,)),
Band("B07", (Unit.REFLECTANCE,), (np.float32,)),
)
LANDSAT_TM_L1 = (
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 6)),
Band("B06", (Unit.BRIGHTNESS_TEMPERATURE,), (np.float32,)),
Band("B07", (Unit.REFLECTANCE,), (np.float32,)),
)
LANDSAT_TM_L2 = (
*(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 6)),
Band("B06", (Unit.SURFACE_TEMPERATURE,), (np.float32,)),
Band("B07", (Unit.REFLECTANCE,), (np.float32,)),
)
LANDSAT_MSS_L1 = tuple(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 5))
HARMONIZED_LANDSAT_SENTINEL = (
Band("CoastalAerosol", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("Blue", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("Green", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("Red", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("RedEdge1", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("RedEdge2", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("RedEdge3", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("NIR_Broad", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("NIR_Narrow", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("SWIR1", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("SWIR2", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("WaterVapor", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("Cirrus", (Unit.REFLECTANCE, Unit.DN), (np.float32, np.uint16)),
Band("ThermalInfrared1", (Unit.BRIGHTNESS_TEMPERATURE, Unit.DN), (np.float32, np.uint16)),
Band("ThermalInfrared2", (Unit.BRIGHTNESS_TEMPERATURE, Unit.DN), (np.float32, np.uint16)),
)
MODIS = tuple(Band(f"B0{index}", (Unit.REFLECTANCE,), (np.float32,)) for index in range(1, 8))
DEM = (Band("DEM", (Unit.METERS,), (np.float32,)),)
[docs]class MetaBands:
"""
Different collections of bands taken from `Sentinel Hub docs <https://docs.sentinel-hub.com/api/latest/data/>`__
"""
SENTINEL1 = (
*(Band(name, (Unit.DN,), (np.float32,)) for name in ["localIncidenceAngle", "scatteringArea"]),
*(Band(name, (Unit.DN,), (bool,)) for name in ["shadowMask", "dataMask"]),
)
SENTINEL2_L1C = (
*(
Band(name, (Unit.DEGREES,), (np.float32,))
for name in ["sunAzimuthAngles", "viewAzimuthMean", "sunZenithAngles", "viewZenithMean"]
),
*(Band(name, (Unit.DN,), (np.uint8,)) for name in ["CLP", "CLM"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
SENTINEL2_L2A = (
Band("AOT", (Unit.OPTICAL_DEPTH, Unit.DN), (np.float32, np.uint16)),
*(
Band(name, (Unit.DEGREES,), (np.float32,))
for name in ["sunAzimuthAngles", "viewAzimuthMean", "sunZenithAngles", "viewZenithMean"]
),
*(Band(name, (Unit.PERCENT,), (np.uint8,)) for name in ["SNW", "CLD"]),
*(Band(name, (Unit.DN,), (np.uint8,)) for name in ["SCL", "CLP", "CLM"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
SENTINEL3_OLCI = (
*(Band(name, (Unit.DEGREES,), (np.float32,)) for name in ["VAA", "VZA", "SAA", "SZA"]),
Band("HUMIDITY", (Unit.PERCENT,), (np.float32,)),
Band("SEA_LEVEL_PRESSURE", (Unit.HECTOPASCALS,), (np.float32,)),
*(Band(name, (Unit.KG_M2,), (np.float32,)) for name in ["TOTAL_COLUMN_OZONE", "TOTAL_COLUMN_WATER_VAPOUR"]),
Band("QUALITY_FLAGS", (Unit.DN,), (np.uint32,)),
Band("dataMask", (Unit.DN,), (bool,)),
)
SENTINEL3_SLSTR = (Band("dataMask", (Unit.DN,), (bool,)),)
SENTINEL5P = (Band("dataMask", (Unit.DN,), (bool,)),)
LANDSAT_OT_L1 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
*(Band(name, (Unit.DEGREES,), (np.float32,)) for name in ["VAA", "VZA", "SAA", "SZA"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
LANDSAT_OT_L2 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
Band("SR_QA_AEROSOL", (Unit.DN,), (np.uint8,)),
Band("ST_QA", (Unit.KELVIN,), (np.float32,)),
Band("ST_TRAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_URAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_DRAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_ATRAN", (Unit.FRACTION,), (np.float32,)),
Band("ST_EMIS", (Unit.FRACTION,), (np.float32,)),
Band("ST_EMSD", (Unit.FRACTION,), (np.float32,)),
Band("ST_CDIST", (Unit.KILOMETERS,), (np.float32,)),
Band("dataMask", (Unit.DN,), (bool,)),
)
LANDSAT_ETM_L1 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
*(Band(name, (Unit.DEGREES,), (np.float32,)) for name in ["VAA", "VZA", "SAA", "SZA"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
LANDSAT_ETM_L2 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
Band("ST_TRAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_URAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_DRAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_ATRAN", (Unit.FRACTION,), (np.float32,)),
Band("ST_EMIS", (Unit.FRACTION,), (np.float32,)),
Band("ST_EMSD", (Unit.FRACTION,), (np.float32,)),
Band("ST_CDIST", (Unit.KILOMETERS,), (np.float32,)),
Band("SR_ATMOS_OPACITY", (Unit.FRACTION,), (np.float32,)),
Band("SR_CLOUD_QA", (Unit.DN,), (np.float32,)),
Band("ST_QA", (Unit.KELVIN,), (np.float32,)),
Band("dataMask", (Unit.DN,), (bool,)),
)
LANDSAT_TM_L1 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
*(Band(name, (Unit.DEGREES,), (np.float32,)) for name in ["VAA", "VZA", "SAA", "SZA"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
LANDSAT_TM_L2 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
Band("ST_TRAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_URAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_DRAD", (Unit.RADIANCE,), (np.float32,)),
Band("ST_ATRAN", (Unit.FRACTION,), (np.float32,)),
Band("ST_EMIS", (Unit.FRACTION,), (np.float32,)),
Band("ST_EMSD", (Unit.FRACTION,), (np.float32,)),
Band("ST_CDIST", (Unit.KILOMETERS,), (np.float32,)),
Band("SR_ATMOS_OPACITY", (Unit.FRACTION,), (np.float32,)),
Band("SR_CLOUD_QA", (Unit.DN,), (np.float32,)),
Band("ST_QA", (Unit.KELVIN,), (np.float32,)),
Band("dataMask", (Unit.DN,), (bool,)),
)
LANDSAT_MSS_L1 = (
*(Band(name, (Unit.DN,), (np.uint16,)) for name in ["BQA", "QA_RADSAT"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
HARMONIZED_LANDSAT_SENTINEL = (
Band("QA", (Unit.DN,), (np.uint16,)),
*(Band(name, (Unit.DEGREES, Unit.DN), (np.float32, np.uint16)) for name in ["VAA", "VZA", "SAA", "SZA"]),
Band("dataMask", (Unit.DN,), (bool,)),
)
MODIS = (Band("dataMask", (Unit.DN,), (bool,)),)
DEM = (Band("dataMask", (Unit.DN,), (bool,)),)