def test_prepare_le07_l2_c2( tmp_path: Path, le07_l2_c2_folder: Path, ): """Support a functionality baseline for the enhancements to expand landsat prepare (YAML) logic to support USGS level 2 - PR#159: LE07 C2 L2.""" assert le07_l2_c2_folder.exists(), "Test data missing(?)" output_path = tmp_path expected_metadata_path = ( output_path / "090" / "084" / "LE07_L2SP_090084_20210331_20210426_02_T1.odc-metadata.yaml") check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=[ "--output-base", output_path, "--producer", "usgs.gov", le07_l2_c2_folder, ], expected_doc=expected_le07_l2_c2_folder(), expected_metadata_path=expected_metadata_path, )
def test_prepare_l8_l1_tarball_with_source(tmp_path: Path, l1_ls8_folder: Path, ls8_telemetry_path, l1_ls8_ga_expected: Dict): """Run prepare script with a source telemetry data and unique producer.""" assert l1_ls8_folder.exists(), "Test data missing(?)" output_path = tmp_path expected_metadata_path = ( output_path / "090" / "084" / "LC08_L1TP_090084_20160121_20170405_01_T1.odc-metadata.yaml") check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=[ "--output-base", output_path, "--producer", "ga.gov.au", "--source", ls8_telemetry_path, l1_ls8_folder, ], expected_doc=l1_ls8_ga_expected, expected_metadata_path=expected_metadata_path, )
def test_prepare_l7_l1_usgs_tarball(l1_ls7_tarball: Path, l1_ls7_tarball_md_expected: Dict): assert l1_ls7_tarball.exists(), "Test data missing(?)" expected_metadata_path = ( l1_ls7_tarball.parent / "LE07_L1TP_104078_20130429_20161124_01_T1.odc-metadata.yaml") check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=[str(l1_ls7_tarball)], expected_doc=l1_ls7_tarball_md_expected, expected_metadata_path=expected_metadata_path, )
def test_prepare_l8_l1_usgs_tarball(l1_ls8_folder, l1_ls8_folder_md_expected): assert l1_ls8_folder.exists(), "Test data missing(?)" # No output path defined,so it will default to being a sibling to the input. expected_metadata_path = ( l1_ls8_folder.parent / "LC08_L1TP_090084_20160121_20170405_01_T1.odc-metadata.yaml") assert not expected_metadata_path.exists() check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=[str(l1_ls8_folder)], expected_doc=l1_ls8_folder_md_expected, expected_metadata_path=expected_metadata_path, )
def test_run(tmp_path, expected_dataset_document): """ Run prepare on our test input scene, and check the created metadata matches expected. """ shutil.copy(DATASET_PATH, tmp_path) expected_metadata_path = tmp_path / ( "S2B_MSIL1C_20201011T000249_N0209_R030_T55HFA_20201011T011446.odc-metadata.yaml" ) check_prepare_outputs( invoke_script=sentinel_l1_prepare.main, run_args=[ tmp_path / DATASET_PATH.name, ], expected_doc=expected_dataset_document, expected_metadata_path=expected_metadata_path, )
def test_sinergise_sentinel_l1(tmp_path, expected_dataset_document): """ Run prepare on our test dataset, and check the out metadata doc matches. """ work_dir = tmp_path / DATASET_DIR.name shutil.copytree(DATASET_DIR, work_dir) output_yaml_path = ( work_dir / "S2B_MSIL1C_20201011T000249_N0209_R030_T55HFA_20201011T011446.odc-metadata.yaml" ) check_prepare_outputs( invoke_script=sentinel_l1_prepare.main, run_args=[ work_dir, ], expected_doc=expected_dataset_document, expected_metadata_path=output_yaml_path, )
def test_generate_expected_outputs( tmp_path: Path, dataset_input_output: Tuple[Path, Dict, Path] ): """ Run prepare on our test input scenes, and check the created metadata matches expected. """ ( input_dataset_path, expected_metadata_doc, expected_metadata_path, ) = dataset_input_output check_prepare_outputs( invoke_script=sentinel_l1_prepare.main, run_args=[ input_dataset_path, ], expected_doc=expected_metadata_doc, expected_metadata_path=expected_metadata_path, )
def test_prepare_l5_l1_usgs_tarball(tmp_path: Path, l1_ls5_tarball_md_expected: Dict, l1_ls5_tarball: Path): assert l1_ls5_tarball.exists(), "Test data missing(?)" output_path: Path = tmp_path / "out" output_path.mkdir() # When specifying an output base path it will create path/row subfolders within it. expected_metadata_path = ( output_path / "090" / "085" / "LT05_L1TP_090085_19970406_20161231_01_T1.odc-metadata.yaml") check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=["--output-base", str(output_path), str(l1_ls5_tarball)], expected_doc=l1_ls5_tarball_md_expected, expected_metadata_path=expected_metadata_path, )
def test_prepare_l9_l1_c2(tmp_path: Path, l1_ls9_tarball: Path, l9_expected: Dict): """Run prepare script with a source telemetry data and unique producer.""" assert l1_ls9_tarball.exists(), "Test data missing(?)" output_path = tmp_path check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=[ "--output-base", output_path, "--producer", "usgs.gov", l1_ls9_tarball, ], expected_doc=l9_expected, expected_metadata_path=( output_path / "112" / "081" / "LC09_L1TP_112081_20220209_20220209_02_T1.odc-metadata.yaml"), )
def test_prepare_s2a_l1c_safe(tmpdir): assert L1_ZIPFILE_PATH.exists(), "Test data missing(?)" output_path = Path(tmpdir) # make a folder and extract contents output_path.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(L1_ZIPFILE_PATH, "r") as zipped_data: zipped_data.extractall(output_path) expected_metadata_path = ( output_path / "S2B_OPER_MSI_L1C_TL_EPAE_20180617T013729_A006677_T55JGF_N02.06.yaml") def path_offset(offset: str): return "s3://sentinel-s2-l1c/tiles/55/J/GF/2018/6/17/0/" + offset expected_doc = { "acquisition": { "groundstation": { "code": "EPA_" } }, "archiving_time": "2018-06-17T02:06:21.973943Z", "creation_dt": "2018-06-17T01:27:55Z", "checksum_sha1": "bfac5eea3ec0c6c70816ddb97592dfd4d8a389e2", "datastrip_id": "S2B_OPER_MSI_L1C_DS_EPAE_20180617T013729_S20180617T001107_N02.06", "datastrip_metadata": ("http://sentinel-s2-l1c.s3-website.eu-central-1.amazonaws.com" "/#products/2018/6/17/S2B_MSIL1C_20180617T001109_N0206_R073_" "T55JGF_20180617T013729/datastrip/0"), "datatake_id": { "datatakeIdentifier": "GS2B_20180617T001109_006677_N02.06", "metadataLevel": "Brief", }, "datatake_sensing_start": "2018-06-17T00:11:09.024Z", "datatake_type": "INS-NOBS", "downlink_priority": "NOMINAL", "extent": { "center_dt": "2018-06-17T00:11:07.458Z", "coord": { "ll": { "lat": -31.705779763545088, "lon": 149.11005323208184 }, "lr": { "lat": -31.681364358256744, "lon": 150.26738162306842 }, "ul": { "lat": -30.715729325189965, "lon": 149.08817422152293 }, "ur": { "lat": -30.6922425616759, "lon": 150.23354450086148 }, }, }, "format": { "name": "JPEG2000" }, "grid_spatial": { "projection": { "geo_ref_points": { "ll": { "x": 699960, "y": 6490240 }, "lr": { "x": 809760, "y": 6490240 }, "ul": { "x": 699960, "y": 6600040 }, "ur": { "x": 809760, "y": 6600040 }, }, "spatial_reference": "EPSG:32755", "valid_data": { "coordinates": [[ [781030.5157393045, 6490240.0], [802194.5431029584, 6568088.898470836], [807815.3469119765, 6599599.456501017], [807233.663302242, 6600040.0], [699960.0, 6600040.0], [699960.0, 6490240.0], [781030.5157393045, 6490240.0], ]], "type": "Polygon", }, } }, "id": "e6e14ee5-c431-559d-8b07-e387648d06c6", "image": { "bands": { "B01": { "layer": 1, "path": path_offset("B01.jp2") }, "B02": { "layer": 1, "path": path_offset("B02.jp2") }, "B03": { "layer": 1, "path": path_offset("B03.jp2") }, "B04": { "layer": 1, "path": path_offset("B04.jp2") }, "B05": { "layer": 1, "path": path_offset("B05.jp2") }, "B06": { "layer": 1, "path": path_offset("B06.jp2") }, "B07": { "layer": 1, "path": path_offset("B07.jp2") }, "B08": { "layer": 1, "path": path_offset("B08.jp2") }, "B09": { "layer": 1, "path": path_offset("B09.jp2") }, "B10": { "layer": 1, "path": path_offset("B10.jp2") }, "B11": { "layer": 1, "path": path_offset("B11.jp2") }, "B12": { "layer": 1, "path": path_offset("B12.jp2") }, "B8A": { "layer": 1, "path": path_offset("B8A.jp2") }, }, "cloud_cover_percentage": 41.1953, "degraded_anc_data_percentage": 0.0, "degraded_msi_data_percentage": 0.0, "format_quality_flag": "PASSED", "general_quality_flag": "PASSED", "geometric_quality_flag": "PASSED", "radiometric_quality_flag": "PASSED", "reflectance_conversion": "0.969545500936321", "sensor_quality_flag": "PASSED", "solar_irradiance": [], "sun_azimuth": 28.329529500752, "sun_elevation": 60.25415978281, "tile_reference": "N02.06", "viewing_angles": [ { "bandId": "0", "measurement": { "azimuth": { "value": 285.033757307864 }, "zenith": { "value": 8.48756458553399 }, }, "unit": "degree", }, { "bandId": "9", "measurement": { "azimuth": { "value": 285.075607281345 }, "zenith": { "value": 8.52241368394389 }, }, "unit": "degree", }, { "bandId": "10", "measurement": { "azimuth": { "value": 284.793804242023 }, "zenith": { "value": 8.34345092249542 }, }, "unit": "degree", }, { "bandId": "1", "measurement": { "azimuth": { "value": 284.793733737481 }, "zenith": { "value": 8.29509641932038 }, }, "unit": "degree", }, { "bandId": "2", "measurement": { "azimuth": { "value": 284.851677995258 }, "zenith": { "value": 8.32126064250559 }, }, "unit": "degree", }, { "bandId": "3", "measurement": { "azimuth": { "value": 284.909295311577 }, "zenith": { "value": 8.3544279324201 }, }, "unit": "degree", }, { "bandId": "4", "measurement": { "azimuth": { "value": 284.933467772596 }, "zenith": { "value": 8.37600138776781 }, }, "unit": "degree", }, { "bandId": "5", "measurement": { "azimuth": { "value": 284.973394067973 }, "zenith": { "value": 8.40018017679447 }, }, "unit": "degree", }, { "bandId": "6", "measurement": { "azimuth": { "value": 285.002316322296 }, "zenith": { "value": 8.42684047592471 }, }, "unit": "degree", }, { "bandId": "7", "measurement": { "azimuth": { "value": 284.82134822338 }, "zenith": { "value": 8.30688902336585 }, }, "unit": "degree", }, { "bandId": "8", "measurement": { "azimuth": { "value": 285.068419119347 }, "zenith": { "value": 8.45522377449714 }, }, "unit": "degree", }, { "bandId": "11", "measurement": { "azimuth": { "value": 284.889987613982 }, "zenith": { "value": 8.39599518380445 }, }, "unit": "degree", }, { "bandId": "12", "measurement": { "azimuth": { "value": 284.999750610317 }, "zenith": { "value": 8.46178406516545 }, }, "unit": "degree", }, ], }, "instrument": { "name": "MSI" }, "lineage": { "source_datasets": {} }, "orbit": "73", "orbit_direction": "DESCENDING", "platform": { "code": "SENTINEL_2B" }, "processing_level": "Level-1C", "product_format": { "name": "s2_aws_pds" }, "product_type": "level1", "size_bytes": 1292575, "tile_id": "S2B_OPER_MSI_L1C_TL_EPAE_20180617T013729_A006677_T55JGF_N02.06", } check_prepare_outputs( invoke_script=s2_l1c_aws_pds_prepare.main, run_args=[ "--output", str(output_path), str(output_path / "S2B_OPER_MSI_L1C_TL_EPAE_20180617T013729_A006677_T55JGF_N02.06" ), ], expected_doc=expected_doc, expected_metadata_path=expected_metadata_path, )
def test_filter_folder_structure_info( tmp_path: Path, dataset_input_output: Tuple[Path, Dict, Path] ): ( input_dataset_path, expected_metadata_doc, expected_metadata_path, ) = dataset_input_output metadata_offset = expected_metadata_path.relative_to(input_dataset_path.parent) input_folder = tmp_path / "inputs" subfolders = "2019/2019-01/25S125E-30S130" # Move input data into subfolder hierarchy. dataset_folder = input_folder / "L1C" / subfolders dataset_folder.mkdir(parents=True) new_input_dataset_path = dataset_folder / input_dataset_path.name input_dataset_path.rename(new_input_dataset_path) input_dataset_path = new_input_dataset_path # Expect metadata files to be stored in an identical hierarchy in a different output folder output_folder = tmp_path / "output" output_folder.mkdir(parents=True) expected_metadata_path = output_folder / subfolders / metadata_offset # Our output metadata is in a different place than the data, so we expect it to # embed the true location in the metadata (by default) if input_dataset_path.is_dir(): expected_metadata_doc[ "location" ] = f"file://{input_dataset_path.as_posix()}/tileInfo.json" else: expected_metadata_doc["location"] = f"zip:{input_dataset_path}!/" # A file with the correct region regions_file = tmp_path / "our-regions.txt" regions_file.write_text("\n".join(["55HFA", "55HFB"])) # A file that doesn't have our region. non_regions_file = tmp_path / "our-non-regions.txt" non_regions_file.write_text("\n".join(["55HFB", "55HFC"])) # Sanity check: no output exists yet. assert not expected_metadata_path.exists() # Run with filters that skips this dataset: # (it should do nothing) # Whitelist including the correct region res = run_prepare_cli( sentinel_l1_prepare.main, # It contains our region, so it should filter! "--only-regions-in-file", regions_file, # "Put the output in a different location": "--output-base", output_folder, input_dataset_path, ) assert ( expected_metadata_path.exists() ), f"Expected dataset to be processed (it's within the region file)! {res.output}" expected_metadata_path.unlink() # Run with a region list that doesn't include our dataset region. res = run_prepare_cli( sentinel_l1_prepare.main, # It contains our region, so it should filter! "--only-regions-in-file", non_regions_file, # "Put the output in a different location": "--output-base", output_folder, input_dataset_path, ) assert ( not expected_metadata_path.exists() ), f"Expected dataset to be filtered out! {res.output}" # Filter the time period res = run_prepare_cli( sentinel_l1_prepare.main, # After our time period, so it should filter! "--after-month", "2019-03", # "Put the output in a different location": "--output-base", output_folder, input_dataset_path, ) assert ( not expected_metadata_path.exists() ), f"Expected dataset to be filtered out! {res.output}" # Filter the time period res = run_prepare_cli( sentinel_l1_prepare.main, # Before our time period, so it should filter! "--before-month", "2018-03", # "Put the output in a different location": "--output-base", output_folder, input_dataset_path, ) assert ( not expected_metadata_path.exists() ), f"Expected dataset to be filtered out! {res.output}" # Now run for real, expect an output. check_prepare_outputs( invoke_script=sentinel_l1_prepare.main, run_args=[ # Before our time period, so it should be fine! "--after-month", "2018-12", # "Put the output in a different location": "--output-base", output_folder, input_dataset_path, ], expected_doc=expected_metadata_doc, expected_metadata_path=expected_metadata_path, ) # Now run again using a folder input, not an exact zip input. # (so it has to scan for datasets) shutil.rmtree(output_folder) output_folder.mkdir() # Now run for real, expect an output. check_prepare_outputs( invoke_script=sentinel_l1_prepare.main, run_args=[ # "Put the output in a different location": "--output-base", output_folder, # The base folder, so it has to scan for zip files itself! input_folder, ], expected_doc=expected_metadata_doc, expected_metadata_path=expected_metadata_path, )
def test_prepare_l8_l1_c2(tmp_path: Path, l1_c2_ls8_folder: Path): """Run prepare script with a source telemetry data and unique producer.""" assert l1_c2_ls8_folder.exists(), "Test data missing(?)" output_path = tmp_path expected_metadata_path = ( output_path / "089" / "074" / "LC08_L1GT_089074_20220506_20220512_02_T2.odc-metadata.yaml") expected_doc = { "$schema": "https://schemas.opendatacube.org/dataset", "id": "5e1359de-0f91-5988-a6f0-8a0a840906f4", "label": "usgs_ls8c_level1_2-0-20220512_089074_2022-05-06", "product": { "name": "usgs_ls8c_level1_2", "href": "https://collections.dea.ga.gov.au/product/usgs_ls8c_level1_2", }, "crs": "epsg:32656", "grids": { "default": { "shape": [60, 60], "transform": [ 3860.5, 0.0, 594285.0, 0.0, -3910.5, -2121285.0, 0.0, 0.0, 1.0, ], }, "panchromatic": { "shape": [60, 60], "transform": [ 3860.2500000000005, 0.0, 594292.5, 0.0, -3910.25, -2121292.5, 0.0, 0.0, 1.0, ], }, }, "geometry": { "type": "Polygon", "coordinates": (( (635871.100911986, -2328431.8044824763), (598807.3537167514, -2315758.4765276713), (594285.0, -2314216.125490317), (594285.0, -2294479.549612592), (629132.1230216483, -2128210.3416854665), (634001.1369104853, -2121285.0), (671771.6827861228, -2121285.0), (759108.8670950294, -2143693.8957929504), (819064.1631236447, -2156587.0374096073), (824424.9683929395, -2160452.642015061), (825915.0, -2160834.95297774), (825915.0, -2197333.359107589), (818095.1372109791, -2231658.3131009457), (784506.5705934291, -2355915.0), (764094.013739199, -2355915.0), (647454.7800689514, -2332349.7060506954), (636125.9731110331, -2328486.0106703877), (635871.100911986, -2328431.8044824763), ), ), }, "properties": { "datetime": "2022-05-06T23:39:59.285133", "eo:cloud_cover": 86.35, "eo:gsd": 15.0, "eo:instrument": "OLI_TIRS", "eo:platform": "landsat-8", "eo:sun_azimuth": 39.80724521, "eo:sun_elevation": 43.24426868, "landsat:collection_category": "T2", "landsat:collection_number": 2, "landsat:data_type": "L1GT", "landsat:landsat_product_id": "LC08_L1GT_089074_20220506_20220512_02_T2", "landsat:landsat_scene_id": "LC80890742022126LGN00", "landsat:processing_software_version": "LPGS_15.6.0", "landsat:station_id": "LGN", "landsat:wrs_path": 89, "landsat:wrs_row": 74, "odc:dataset_version": "2.0.20220512", "odc:file_format": "GeoTIFF", "odc:processing_datetime": "2022-05-12T14:00:17", "odc:producer": "usgs.gov", "odc:product_family": "level1", "odc:region_code": "089074", }, "measurements": { "blue": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B2.TIF" }, "cirrus": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B9.TIF" }, "coastal_aerosol": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B1.TIF" }, "green": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B3.TIF" }, "lwir_1": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B10.TIF" }, "lwir_2": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B11.TIF" }, "nir": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B5.TIF" }, "panchromatic": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B8.TIF", "grid": "panchromatic", }, "qa_radsat": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_QA_RADSAT.TIF" }, "quality": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_QA_PIXEL.TIF" }, "red": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B4.TIF" }, "solar_azimuth": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_SAA.TIF" }, "solar_zenith": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_SZA.TIF" }, "swir_1": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B6.TIF" }, "swir_2": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B7.TIF" }, "view_azimuth": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_VAA.TIF" }, "view_zenith": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_VZA.TIF" }, }, "accessories": { "metadata:landsat_mtl": { "path": "LC08_L1GT_089074_20220506_20220512_02_T2_MTL.txt" } }, "lineage": {}, } check_prepare_outputs( invoke_script=landsat_l1_prepare.main, run_args=[ "--output-base", output_path, "--producer", "usgs.gov", l1_c2_ls8_folder, ], expected_doc=expected_doc, expected_metadata_path=expected_metadata_path, )
def test_prepare_s2a_l1c_safe(tmpdir): assert L1_ZIPFILE_PATH.exists(), "Test data missing(?)" output_path = Path(tmpdir) expected_metadata_path = ( output_path / "S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.zip.yaml" ) granule_path = ( "/S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.SAFE" "/GRANULE/L1C_T56JMM_A015757_20180629T000241/" ) def path_offset(offset: str, granule_path=granule_path): return "zip://" + str(L1_ZIPFILE_PATH.absolute()) + "!" + granule_path + offset expected_doc = { "acquisition": {"groundstation": {"code": "EPA_"}}, "archiving_time": "2018-06-29T03:44:20.252114Z", "checksum_sha1": "908571e2cdd54174fb051272be34fe73f6efb9a5", "creation_dt": "2018-06-29T01:20:42.000000Z", "datastrip_id": "S2A_OPER_MSI_L1C_DS_EPAE_20180629T012042_S20180629T000241_N02.06", "datastrip_metadata": ( "S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.SAFE" "/DATASTRIP/DS_EPAE_20180629T012042_S20180629T000241/MTD_DS.xml" ), "datatake_id": {"datatakeIdentifier": "GS2A_20180629T000241_015757_N02.06"}, "datatake_sensing_start": "2018-06-29T00:02:41.024Z", "datatake_type": "INS-NOBS", "downlink_priority": "NOMINAL", "extent": { "center_dt": "2018-06-29T00:02:41.461Z", "coord": { "ll": {"lat": -30.81709901611161, "lon": 151.95410707081012}, "lr": {"lat": -30.82128003446065, "lon": 153.10204544208213}, "ul": {"lat": -29.82640952246035, "lon": 151.9645797990478}, "ur": {"lat": -29.83042869279505, "lon": 153.10102341983713}, }, "from_dt": "2018-06-29T00:02:41.024Z", "to_dt": "2018-06-29T00:02:41.024Z", }, "format": {"name": "JPEG2000"}, "grid_spatial": { "projection": { "geo_ref_points": { "ll": {"x": 399960, "y": 6590200}, "lr": {"x": 509760, "y": 6590200}, "ul": {"x": 399960, "y": 6700000}, "ur": {"x": 509760, "y": 6700000}, }, "spatial_reference": "EPSG:32756", "valid_data": { "coordinates": [ [ [470826.97121060337, 6590200.0], [475130.9086383948, 6598904.030892345], [493180.2237068879, 6681630.058289605], [493214.79452054796, 6700000.0], [399960.0, 6700000.0], [399960.0, 6590200.0], [470826.97121060337, 6590200.0], ] ], "type": "Polygon", }, } }, "id": "d6004c21-171f-5a76-8e4f-2de359af506a", "image": { "bands": { "B01": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B01.jp2"), }, "B02": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B02.jp2"), }, "B03": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B03.jp2"), }, "B04": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B04.jp2"), }, "B05": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B05.jp2"), }, "B06": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B06.jp2"), }, "B07": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B07.jp2"), }, "B08": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B08.jp2"), }, "B09": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B09.jp2"), }, "B10": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B10.jp2"), }, "B11": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B11.jp2"), }, "B12": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B12.jp2"), }, "B8A": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B8A.jp2"), }, "PVI": { "layer": 1, "path": path_offset("QI_DATA/T56JMM_20180629T000241_PVI.jp2"), }, "TCI": { "layer": 1, "path": path_offset("IMG_DATA/T56JMM_20180629T000241_TCI.jp2"), }, }, "cloud_cover_percentage": 0.0, "degraded_anc_data_percentage": 0.0, "degraded_msi_data_percentage": 0.0, "format_quality_flag": "", "general_quality_flag": "", "geometric_quality_flag": "", "null_value": "0", "radiometric_quality_flag": "", "reflectance_conversion": "0.967798898595979", "saturated": "65535", "sensor_quality_flag": "", "solar_irradiance": [ {"bandId": "0", "unit": "W/m²/µm", "value": "1884.69"}, {"bandId": "1", "unit": "W/m²/µm", "value": "1959.72"}, {"bandId": "2", "unit": "W/m²/µm", "value": "1823.24"}, {"bandId": "3", "unit": "W/m²/µm", "value": "1512.06"}, {"bandId": "4", "unit": "W/m²/µm", "value": "1424.64"}, {"bandId": "5", "unit": "W/m²/µm", "value": "1287.61"}, {"bandId": "6", "unit": "W/m²/µm", "value": "1162.08"}, {"bandId": "7", "unit": "W/m²/µm", "value": "1041.63"}, {"bandId": "8", "unit": "W/m²/µm", "value": "955.32"}, {"bandId": "9", "unit": "W/m²/µm", "value": "812.92"}, {"bandId": "10", "unit": "W/m²/µm", "value": "367.15"}, {"bandId": "11", "unit": "W/m²/µm", "value": "245.59"}, {"bandId": "12", "unit": "W/m²/µm", "value": "85.25"}, ], "sun_azimuth": 28.9784209875988, "sun_elevation": 59.5161129280706, "tile_reference": "N02.06", "viewing_angles": [ { "bandId": "0", "measurement": { "azimuth": {"value": 287.743300570742}, "zenith": {"value": 8.90682426360539}, }, "unit": "degree", }, { "bandId": "9", "measurement": { "azimuth": {"value": 287.913358161721}, "zenith": {"value": 8.93763578589198}, }, "unit": "degree", }, { "bandId": "10", "measurement": { "azimuth": {"value": 286.62269660653}, "zenith": {"value": 8.77437299338626}, }, "unit": "degree", }, { "bandId": "1", "measurement": { "azimuth": {"value": 286.085976995274}, "zenith": {"value": 8.70023786261715}, }, "unit": "degree", }, { "bandId": "2", "measurement": { "azimuth": {"value": 286.471239179063}, "zenith": {"value": 8.72476018739389}, }, "unit": "degree", }, { "bandId": "3", "measurement": { "azimuth": {"value": 286.832768592131}, "zenith": {"value": 8.75574267151839}, }, "unit": "degree", }, { "bandId": "4", "measurement": { "azimuth": {"value": 287.013584765891}, "zenith": {"value": 8.77685536841587}, }, "unit": "degree", }, { "bandId": "5", "measurement": { "azimuth": {"value": 287.207324001684}, "zenith": {"value": 8.80050900146543}, }, "unit": "degree", }, { "bandId": "6", "measurement": { "azimuth": {"value": 287.400419388821}, "zenith": {"value": 8.8344918122903}, }, "unit": "degree", }, { "bandId": "7", "measurement": { "azimuth": {"value": 286.272771889735}, "zenith": {"value": 8.71220887022109}, }, "unit": "degree", }, { "bandId": "8", "measurement": { "azimuth": {"value": 287.592709087249}, "zenith": {"value": 8.86277189674952}, }, "unit": "degree", }, { "bandId": "11", "measurement": { "azimuth": {"value": 287.100489102096}, "zenith": {"value": 8.84204098088515}, }, "unit": "degree", }, { "bandId": "12", "measurement": { "azimuth": {"value": 287.498739900102}, "zenith": {"value": 8.90079212851159}, }, "unit": "degree", }, ], }, "instrument": {"name": "MSI"}, "lineage": {"source_datasets": {}}, "orbit": "30", "orbit_direction": "DESCENDING", "platform": {"code": "Sentinel-2A"}, "processing_baseline": "02.06", "processing_level": "Level-1C", "product_format": {"name": "SAFE_COMPACT"}, "product_type": "S2MSI1C", "product_uri": "S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.SAFE", "size_bytes": 1837225, "tile_id": "S2A_OPER_MSI_L1C_TL_EPAE_20180629T012042_A015757_T56JMM_N02.06", } check_prepare_outputs( invoke_script=s2_prepare_cophub_zip.main, run_args=[ "--newer-than", "1970-01-01", "--output", str(output_path), str(L1_ZIPFILE_PATH), ], expected_doc=expected_doc, expected_metadata_path=expected_metadata_path, )