CsgProduct#

class CsgProduct(product_path: Union[str, cloudpathlib.cloudpath.CloudPath, Path], archive_path: Optional[Union[str, cloudpathlib.cloudpath.CloudPath, Path]] = None, output_path: Optional[Union[str, cloudpathlib.cloudpath.CloudPath, Path]] = None, remove_tmp: bool = False, **kwargs)[source]#

Bases: eoreader.products.sar.cosmo_product.CosmoProduct

Class for COSMO-SkyMed 2nd Generation Products More info here.

__init__(product_path: Union[str, cloudpathlib.cloudpath.CloudPath, Path], archive_path: Optional[Union[str, cloudpathlib.cloudpath.CloudPath, Path]] = None, output_path: Optional[Union[str, cloudpathlib.cloudpath.CloudPath, Path]] = None, remove_tmp: bool = False, **kwargs) None#
clean_tmp()#

Clean the temporary directory of the current product

clear()#

Clear this product’s cache

get_band_paths(band_list: list, resolution: Optional[float] = None, **kwargs) dict#

Return the paths of required bands.

Warning

This functions orthorectifies and despeckles SAR bands if not existing !

>>> from eoreader.reader import Reader
>>> from eoreader.bands import *
>>> path = r"S1A_IW_GRDH_1SDV_20191215T060906_20191215T060931_030355_0378F7_3696.zip"
>>> prod = Reader().open(path)
>>> prod.get_band_paths([VV, HH])
{
    <SarBandNames.VV: 'VV'>: '20191215T060906_S1_IW_GRD/20191215T060906_S1_IW_GRD_VV.tif'
}
>>> # HH doesn't exist
Parameters
  • band_list (list) – List of the wanted bands

  • resolution (float) – Band resolution

  • kwargs – Other arguments used to load bands

Returns

Dictionary containing the path of each queried band

Return type

dict

get_date(as_date: bool = False) Union[str, date]#

Get the product’s acquisition date.

>>> from eoreader.reader import Reader
>>> path = r"S2A_MSIL1C_20200824T110631_N0209_R137_T30TTK_20200824T150432.SAFE.zip"
>>> prod = Reader().open(path)
>>> prod.get_date(as_date=True)
datetime.datetime(2020, 8, 24, 0, 0)
>>> prod.get_date(as_date=False)
'20200824'
Parameters

as_date (bool) – Return the date as a datetime.date. If false, returns a string.

Returns

Its acquisition date

Return type

str

get_datetime(as_datetime: bool = False) Union[str, datetime]#

Get the product’s acquisition datetime, with format YYYYMMDDTHHMMSS <-> %Y%m%dT%H%M%S

>>> from eoreader.reader import Reader
>>> path = r"1011117-766193"
>>> prod = Reader().open(path)
>>> prod.get_datetime(as_datetime=True)
datetime.datetime(2020, 10, 28, 22, 46, 25)
>>> prod.get_datetime(as_datetime=False)
'20201028T224625'
Parameters

as_datetime (bool) – Return the date as a datetime.datetime. If false, returns a string.

Returns

Its acquisition datetime

Return type

Union[str, datetime]

get_default_band() BandNames#

Get default band: The first existing one between VV and HH for SAR data.

>>> from eoreader.reader import Reader
>>> path = r"S1A_IW_GRDH_1SDV_20191215T060906_20191215T060931_030355_0378F7_3696.zip"
>>> prod = Reader().open(path)
>>> prod.get_default_band()
<SarBandNames.VV: 'VV'>
Returns

Default band

Return type

str

get_default_band_path(**kwargs) Union[cloudpathlib.cloudpath.CloudPath, Path]#

Get default band path (the first existing one between VV and HH for SAR data), ready to use (orthorectified)

Warning

This functions orthorectifies SAR bands if not existing !

>>> from eoreader.reader import Reader
>>> path = r"S1A_IW_GRDH_1SDV_20191215T060906_20191215T060931_030355_0378F7_3696.zip"
>>> prod = Reader().open(path)
>>> prod.get_default_band_path()
Executing processing graph
....10%....20%....30%....40%....50%....60%....70%....80%....90% done.
'20191215T060906_S1_IW_GRD/20191215T060906_S1_IW_GRD_VV.tif'
Parameters

kwargs – Additional arguments

Returns

Default band path

Return type

Union[CloudPath, Path]

get_existing_band_paths() dict#

Return the existing orthorectified band paths (including despeckle bands).

Warning

This functions orthorectifies SAR bands if not existing !

Warning

This functions despeckles SAR bands if not existing !

>>> from eoreader.reader import Reader
>>> from eoreader.bands import *
>>> path = r"S1A_IW_GRDH_1SDV_20191215T060906_20191215T060931_030355_0378F7_3696.zip"
>>> prod = Reader().open(path)
>>> prod.get_existing_band_paths()
Executing processing graph
....10%....20%....30%....40%....50%....60%....70%....80%....90% done.
Executing processing graph
....10%....20%....30%....40%....50%....60%....70%....80%....90% done.
{
    <SarBandNames.VV: 'VV'>: '20191215T060906_S1_IW_GRD/20191215T060906_S1_IW_GRD_VV.tif',
    <SarBandNames.VH: 'VH'>: '20191215T060906_S1_IW_GRD/20191215T060906_S1_IW_GRD_VH.tif',
    <SarBandNames.VV_DSPK: 'VV_DSPK'>: '20191215T060906_S1_IW_GRD/20191215T060906_S1_IW_GRD_VV_DSPK.tif',
    <SarBandNames.VH_DSPK: 'VH_DSPK'>: '20191215T060906_S1_IW_GRD/20191215T060906_S1_IW_GRD_VH_DSPK.tif'
}
Returns

Dictionary containing the path of every orthorectified bands

Return type

dict

get_existing_bands() list#

Return the existing orthorectified bands (including despeckle bands).

>>> from eoreader.reader import Reader
>>> from eoreader.bands import *
>>> path = r"S1A_IW_GRDH_1SDV_20191215T060906_20191215T060931_030355_0378F7_3696.zip"
>>> prod = Reader().open(path)
>>> prod.get_existing_bands()
[<SarBandNames.VV: 'VV'>,
<SarBandNames.VH: 'VH'>,
<SarBandNames.VV_DSPK: 'VV_DSPK'>,
<SarBandNames.VH_DSPK: 'VH_DSPK'>]
Returns

List of existing bands in the products

Return type

list

get_quicklook_path() str#

Get quicklook path if existing.

Returns

Quicklook path

Return type

str

has_band(band: Union[BandNames, Callable]) bool#

Does this products has the specified band ?

By band, we mean:

  • satellite band

  • index

  • DEM band

  • cloud band

>>> from eoreader.reader import Reader
>>> from eoreader.bands import *
>>> path = r"S2A_MSIL1C_20200824T110631_N0209_R137_T30TTK_20200824T150432.SAFE.zip"
>>> prod = Reader().open(path)
>>> prod.has_band(GREEN)
True
>>> prod.has_band(TIR_2)
False
>>> prod.has_band(NDVI)
True
>>> prod.has_band(SHADOWS)
False
>>> prod.has_band(HILLSHADE)
True
Parameters

band (Union[BandNames, Callable]) – EOReader band (optical, SAR, clouds, DEM)

Returns

True if the products has the specified band

Return type

bool

has_bands(bands: Union[list, BandNames, Callable]) bool#

Does this products has the specified bands ?

By band, we mean:

  • satellite band

  • index

  • DEM band

  • cloud band

See has_bands for a code example.

Parameters

bands (Union[list, BandNames, Callable]) – EOReader bands (optical, SAR, clouds, DEM)

Returns

True if the products has the specified band

Return type

bool

load(bands: Union[list, BandNames, Callable], resolution: Optional[float] = None, size: Optional[Union[list, tuple]] = None, **kwargs) dict#

Open the bands and compute the wanted index.

The bands will be purged of nodata and invalid pixels, the nodata will be set to 0 and the bands will be masked arrays in float.

Bands that come out this function at the same time are collocated and therefore have the same shapes. This can be broken if you load data separately. Its is best to always load DEM data with some real bands.

>>> from eoreader.reader import Reader
>>> from eoreader.bands import *
>>> path = r"S2A_MSIL1C_20200824T110631_N0209_R137_T30TTK_20200824T150432.SAFE.zip"
>>> prod = Reader().open(path)
>>> bands = prod.load([GREEN, NDVI], resolution=20)
>>> bands
{
    <function NDVI at 0x000001EFFFF5DD08>: <xarray.DataArray 'NDVI' (band: 1, y: 5490, x: 5490)>
    array([[[0.949506  , 0.92181516, 0.9279379 , ..., 1.8002278 ,
             1.5424857 , 1.6747767 ],
            [0.95369846, 0.91685396, 0.8957871 , ..., 1.5847116 ,
             1.5248713 , 1.5011379 ],
            [2.9928885 , 1.3031474 , 1.0076253 , ..., 1.5969834 ,
             1.5590671 , 1.5018653 ],
            ...,
            [1.4245619 , 1.6115025 , 1.6201663 , ..., 1.2387121 ,
             1.4025431 , 1.800678  ],
            [1.5627214 , 1.822388  , 1.7245892 , ..., 1.1694248 ,
             1.2573677 , 1.5767351 ],
            [1.653781  , 1.6424649 , 1.5923225 , ..., 1.3072611 ,
             1.2181134 , 1.2478763 ]]], dtype=float32)
    Coordinates:
      * band         (band) int32 1
      * y            (y) float64 4.5e+06 4.5e+06 4.5e+06 ... 4.39e+06 4.39e+06
      * x            (x) float64 2e+05 2e+05 2e+05 ... 3.097e+05 3.098e+05 3.098e+05
        spatial_ref  int32 0,
    <OpticalBandNames.GREEN: 'GREEN'>: <xarray.DataArray (band: 1, y: 5490, x: 5490)>
    array([[[0.0615  , 0.061625, 0.061   , ..., 0.12085 , 0.120225,
             0.113575],
            [0.061075, 0.06045 , 0.06025 , ..., 0.114625, 0.119625,
             0.117625],
            [0.06475 , 0.06145 , 0.060925, ..., 0.111475, 0.114925,
             0.115175],
            ...,
            [0.1516  , 0.14195 , 0.1391  , ..., 0.159975, 0.14145 ,
             0.127075],
            [0.140325, 0.125975, 0.131875, ..., 0.18245 , 0.1565  ,
             0.13015 ],
            [0.133475, 0.1341  , 0.13345 , ..., 0.15565 , 0.170675,
             0.16405 ]]], dtype=float32)
    Coordinates:
      * band         (band) int32 1
      * y            (y) float64 4.5e+06 4.5e+06 4.5e+06 ... 4.39e+06 4.39e+06
      * x            (x) float64 2e+05 2e+05 2e+05 ... 3.097e+05 3.098e+05 3.098e+05
        spatial_ref  int32 0
}
Parameters
  • bands (Union[list, BandNames, Callable]) – Band list

  • resolution (float) – Resolution of the band, in meters

  • size (Union[tuple, list]) – Size of the array (width, height). Not used if resolution is provided.

  • kwargs – Other arguments used to load bands

Returns

{band_name, band xarray}

Return type

dict

plot() None#

Plot the quicklook if existing

read_mtd()#

Read metadata and outputs the metadata XML root and its namespaces as a dict.

>>> from eoreader.reader import Reader
>>> path = r"S1A_IW_GRDH_1SDV_20191215T060906_20191215T060931_030355_0378F7_3696.zip"
>>> prod = Reader().open(path)
>>> prod.read_mtd()
(<Element product at 0x1832895d788>, '')
Returns

Metadata XML root and its namespace

Return type

(etree._Element, dict)

stack(bands: list, resolution: Optional[float] = None, size: Optional[Union[list, tuple]] = None, stack_path: Optional[Union[str, cloudpathlib.cloudpath.CloudPath, Path]] = None, save_as_int: bool = False, **kwargs) xarray.core.dataarray.DataArray#

Stack bands and index of a products.

>>> from eoreader.reader import Reader
>>> from eoreader.bands import *
>>> path = r"S2A_MSIL1C_20200824T110631_N0209_R137_T30TTK_20200824T150432.SAFE.zip"
>>> prod = Reader().open(path)
>>> stack = prod.stack([NDVI, MNDWI, GREEN], resolution=20)  # In meters
>>> stack
<xarray.DataArray 'NDVI_MNDWI_GREEN' (z: 3, y: 5490, x: 5490)>
array([[[ 0.949506  ,  0.92181516,  0.9279379 , ...,  1.8002278 ,
          1.5424857 ,  1.6747767 ],
        [ 0.95369846,  0.91685396,  0.8957871 , ...,  1.5847116 ,
          1.5248713 ,  1.5011379 ],
        [ 2.9928885 ,  1.3031474 ,  1.0076253 , ...,  1.5969834 ,
          1.5590671 ,  1.5018653 ],
        ...,
        [ 1.4245619 ,  1.6115025 ,  1.6201663 , ...,  1.2387121 ,
          1.4025431 ,  1.800678  ],
        [ 1.5627214 ,  1.822388  ,  1.7245892 , ...,  1.1694248 ,
          1.2573677 ,  1.5767351 ],
        [ 1.653781  ,  1.6424649 ,  1.5923225 , ...,  1.3072611 ,
          1.2181134 ,  1.2478763 ]],
       [[ 0.27066118,  0.23466069,  0.18792598, ..., -0.4611526 ,
         -0.49751845, -0.4865216 ],
        [ 0.22425456,  0.28004232,  0.27851456, ..., -0.5032771 ,
         -0.501796  , -0.502669  ],
        [-0.07466951,  0.06360884,  0.1207174 , ..., -0.50617427,
         -0.50219285, -0.5034222 ],
        [-0.47076276, -0.4705828 , -0.4747971 , ..., -0.32138503,
         -0.36619243, -0.37428448],
        [-0.4826967 , -0.5032287 , -0.48544118, ..., -0.278925  ,
         -0.31404778, -0.36052078],
        [-0.488381  , -0.48253912, -0.4697526 , ..., -0.38105175,
         -0.30813277, -0.27739233]],
       [[ 0.0615    ,  0.061625  ,  0.061     , ...,  0.12085   ,
          0.120225  ,  0.113575  ],
        [ 0.061075  ,  0.06045   ,  0.06025   , ...,  0.114625  ,
          0.119625  ,  0.117625  ],
        [ 0.06475   ,  0.06145   ,  0.060925  , ...,  0.111475  ,
          0.114925  ,  0.115175  ],
        ...,
        [ 0.1516    ,  0.14195   ,  0.1391    , ...,  0.159975  ,
          0.14145   ,  0.127075  ],
        [ 0.140325  ,  0.125975  ,  0.131875  , ...,  0.18245   ,
          0.1565    ,  0.13015   ],
        [ 0.133475  ,  0.1341    ,  0.13345   , ...,  0.15565   ,
          0.170675  ,  0.16405   ]]], dtype=float32)
Coordinates:
  * y            (y) float64 4.5e+06 4.5e+06 4.5e+06 ... 4.39e+06 4.39e+06
  * x            (x) float64 2e+05 2e+05 2e+05 ... 3.097e+05 3.098e+05 3.098e+05
    spatial_ref  int32 0
  * z            (z) MultiIndex
  - variable     (z) object 'NDVI' 'MNDWI' 'GREEN'
  - band         (z) int64 1 1 1
-Attributes:
    long_name:  ['NDVI', 'MNDWI', 'GREEN']
Parameters
  • bands (list) – Bands and index combination

  • resolution (float) – Stack resolution. . If not specified, use the product resolution.

  • size (Union[tuple, list]) – Size of the array (width, height). Not used if resolution is provided.

  • stack_path (Union[str, CloudPath, Path]) – Stack path

  • save_as_int (bool) – Convert stack to uint16 to save disk space (and therefore multiply the values by 10.000)

  • **kwargs – Other arguments passed to load or rioxarray.to_raster() (such as compress)

Returns

Stack as a DataArray

Return type

xr.DataArray

archive_path#

Archive path, same as the product path if not specified. Useful when you want to know where both the extracted and archived version of your product are stored.

band_names#

Band mapping between band wrapping names such as GREEN and band real number such as 03 for Sentinel-2.

condensed_name#

Condensed name, the filename with only useful data to keep the name unique (ie. 20191215T110441_S2_30TXP_L2A_122756). Used to shorten names and paths.

corresponding_ref#

The corresponding reference products to the current one (if the product is not a reference but has a reference data corresponding to it). A list because of multiple ref in case of non-stackable products (S3, S1…)

crs = <methodtools._LruCacheWire object>#
date#

Acquisition date.

datetime#

Acquisition datetime.

default_transform = <methodtools._LruCacheWire object>#
extent = <methodtools._LruCacheWire object>#
filename#

Product filename

footprint = <methodtools._LruCacheWire object>#
get_orbit_direction = <methodtools._LruCacheWire object>#
is_archived#

Is the archived product is processed (a products is considered as archived if its products path is a directory).

is_reference#

If the product is a reference, used for algorithms that need pre and post data, such as fire detection.

name#

Product true name (as specified in the metadata)

needs_extraction#

Does this products needs to be extracted to be processed ? (True by default).

nodata#

Product nodata, set to -9999 by default

property output: Union[cloudpathlib.cloudpath.CloudPath, Path]#

Output directory of the product, to write orthorectified data for example.

path#

Usable path to the product, either extracted or archived path, according to the satellite.

platform#

Product platform, such as Sentinel-2

pol_channels#

Polarization Channels stored in the current product

product_type#

Product type, satellite-related field, such as L1C or L2A for Sentinel-2 data.

resolution#

Default resolution in meters of the current product. For SAR product, we use Ground Range resolution as we will automatically orthorectify the tiles.

sar_prod_type#

SAR product type, either Single Look Complex or Ground Range

sat_id#

Satellite ID, i.e. S2 for Sentinel-2

sensor_mode#

Sensor Mode of the current product

sensor_type#

Sensor type, SAR or optical.

snap_filename#

Path used by SNAP to process this product

split_name#

Split name, to retrieve every information from its true name (dates, tile, product type…).

tile_name#

Tile if possible (for data that can be piled, for example S2 and Landsats).

wgs84_extent = <methodtools._LruCacheWire object>#