Landsat 8 and 9 (from USGS) ########################### Description *********** Landsat 8 and 9 images are optical and thermal images measured every 8 days, with a resolution of 30 meters. Supported images and levels are: .. list-table:: * - - Optical - Thermal * - Level 1 - ✗ - ✓ * - Level 2 - ✓ - ✓ These images are available to download `here `_. Additional information can be found `here `_ and `here `_ for level 2 products and `here `_ for level 1 products. Usage ***** To use these images as iota2 input two ways are available: General sensor ++++++++++++++ The simplest way is to use one general sensor, called ``Landsat8USGS``. It uses all provided images and processes them identically. ``chain.l8_usgs_path`` is the parameter to enable the use of Landsat 8 and 9 products by iota2. .. code-block:: chain: { ... l8_usgs_path:"/absolute/path/to/Storage_directory" ... } .. warning:: While simpler to use, this method may introduce processing errors, due to the differing nature of the images: thermal images shouldn't be processed exactly like optical images. Differentiated sensors ++++++++++++++++++++++ The ideal way of dealing with Landsat 8 and 9 images is using multiple sensors, one for each type of supported images: .. code-block:: chain: { ... l8_usgs_optical_path:"/absolute/path/to/Storage_directory_optical" l8_usgs_thermal_path:"/absolute/path/to/Storage_directory_thermal" l8_usgs_infrared_path:"/absolute/path/to/Storage_directory_infrared" ... } With: Optical: Level 2 optical products (bands 1 to 7): ``["B1", "B2", "B3", "B4", "B5", "B6", "B7"]`` Thermal: Level 2 thermal product (band 10) and emissivity map: ``["B10", "EMIS"]`` .. warning:: The use of the emissivity is supported but not activated by default, as it doesn't seem to add pertinent information. Infrared: Level 1 thermal products (bands 11 and 12): ``["B10", "B11"]`` Image files can be stored either across multiple different directories or within a single directory (much simpler solution): .. code-block:: └── Storage_directory ├── tile199029 │ ├── LC08_L2SP_199029_20230309_20230320_02_T1 │ │ ├── LC08_L2SP_199029_20230309_20230320_02_T1_SR_B1.TIF # Level 2, band 1 (optical) │ │ ├── LC08_L2SP_199029_20230309_20230320_02_T1_ST_B10.TIF # Level 2, band 10 (LST) │ │ ├── LC08_L1TP_199029_20230309_20230320_02_T1_B10.TIF # Level 1, band 10 (infrared) │ │ ├── ... │ │ └── *.tif │ ├── LC08_L2SP_199029_20230325_20230404_02_T1 │ │ └── *.tif │ └── ... ├── tile199030 │ └── ... └── ... .. note:: Each sensor has a dedicated section in the configuration file, each containing three parameters: - ``keep_bands``: selects which band(s)/product(s) to use - ``enable_sensor_gapfilling``: enables or disables temporal gapfilling (useful for thermal and IR images) - ``temporal_resolution``: sets the resolution for the gapfilling Example: .. code-block:: chain: { ... } Landsat8_usgs_thermal: { temporal_resolution = 16 keep_bands = ["B2", "B3", "B4", "B7"] enable_sensor_gapfilling = True } Landsat8_usgs_thermal: { temporal_resolution = 16 keep_bands = ["B10", "EMIS"] enable_sensor_gapfilling = False } Landsat8_usgs_infrared: { temporal_resolution = 16 enable_sensor_gapfilling = False }... Required images +++++++++++++++ In order to run using a landsat 8 sensor, the chain also requires at least 3 masks (included in downloadable products): - Cloud mask, called ``QA_PIXEL`` (pixel quality assessment) - Saturation mask, called ``QA_RADSAT`` (radiometric saturation quality assessment) - Metadata file, called ``MTL`` Usage with other sensors ++++++++++++++++++++++++ It is also possible to use this (these) sensor(s) with other ones available in iota2 (i.e. Sentinel-2). Sentinel-2 and Landsat 8/9 data (provided by the USGS) use different tiling systems, so you first need to use a `specific builder `_ in order to re-tile one of the two datasets you are using. The process (for one tile) is the following: 1. Download landsat and sentinel images 2. Use iota2's tiler builder (to the :doc:`builder's documentation ` for more details) with a first configuration file: .. code-block:: chain : { output_path : '/path/to/tiled/images' first_step : 'tiler' last_step : 'tiler' proj : 'EPSG:2154' rasters_grid_path : '/path/to/reference/images' list_tile : 'T30TXQ' features_path : '/path/to/images/to/be/tiled/' spatial_resolution : 10 # mandatory but not used in this case. The output spatial resolution will be the one found in 'rasters_grid_path' directory. } builders: { builders_class_name : ["I2FeaturesToGrid"] } 3. Place the images as expected by iota2. Images from different sensors don't need to be in the same directory, but need to be in a directory with the same name, corresponding to the tile. For example: .. code-block:: ├── landsat_data │ └── T30TXQ # tile (common name for all sensors) │ ├── LC08_L2SP_199029_20230309_20230320_02_T1 # date 1 directory │ │ ├── LC08_L2SP_199029_20230309_20230320_02_T1_SR_B1.TIF │ │ ├── LC08_L2SP_199029_20230309_20230320_02_T1_ST_B10.TIF │ │ └── ... │ ├── LC08_L2SP_199029_20230325_20230404_02_T1 # date 2 directory │ │ └── *.tif │ └── ... └── sentinel_data └── T30TXQ # tile (common name for all sensors) ├── SENTINEL2A_20230217-110844-292_L2A_T30TXQ_D_V3-1 # date 1 directory │ ├── MASKS │ │ └── SENTINEL2A_20230217-110844-292_L2A_T30TXQ_D_V3-1_*.tif │ ├── SENTINEL2A_20230217-110844-292_L2A_T30TXQ_D_V3-1_FRE_B*.tif │ ├── SENTINEL2A_20230217-110844-292_L2A_T30TXQ_D_V3-1_FRE_STACK.tif │ └── ... ├── SENTINEL2B_20230304-110849-778_L2A_T30TXQ_D_V3-1 │ └── *.tif └── ... 4. Run iota2 as usual, with two sensors. For example, in order to use thermal images from Landsat 8 and optical images from Sentinel-2: .. code-block:: chain : { output_path : '/path/to/output/' remove_output_path : True nomenclature_path : '/path/to/file' list_tile : 'T30TXQ' l8_usgs_thermal_path = '/path/to/landsat/images/' s2_path : '/path/to/sentinel/images/' ground_truth : '/path/to/file' data_field : 'id' spatial_resolution : 10 color_table : '/path/to/file' proj : 'EPSG:32630' first_step: "init" last_step: "validation" } arg_train : { classifier : 'sharkrf' otb_classifier_options : {"classifier.sharkrf.nbtrees" : 100 } sample_selection: {"sampler": "random", "strategy": "percent", "strategy.percent.p": 0.1} random_seed: 1234 } arg_classification : { classif_mode : 'separate' } sensors_data_interpolation : { write_outputs: False }