eotdl 2023.11.2.post5__py3-none-any.whl → 2023.11.3.post2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- eotdl/__init__.py +1 -1
- eotdl/access/__init__.py +6 -3
- eotdl/access/airbus/__init__.py +5 -1
- eotdl/access/airbus/client.py +356 -338
- eotdl/access/airbus/parameters.py +19 -4
- eotdl/access/airbus/utils.py +26 -21
- eotdl/access/download.py +30 -14
- eotdl/access/search.py +17 -6
- eotdl/access/sentinelhub/__init__.py +5 -1
- eotdl/access/sentinelhub/client.py +57 -54
- eotdl/access/sentinelhub/evalscripts.py +38 -39
- eotdl/access/sentinelhub/parameters.py +43 -23
- eotdl/access/sentinelhub/utils.py +38 -28
- eotdl/auth/errors.py +2 -1
- eotdl/commands/auth.py +3 -3
- eotdl/curation/__init__.py +5 -1
- eotdl/curation/stac/__init__.py +5 -1
- eotdl/curation/stac/assets.py +55 -32
- eotdl/curation/stac/dataframe.py +20 -14
- eotdl/curation/stac/dataframe_bck.py +2 -2
- eotdl/curation/stac/dataframe_labeling.py +15 -12
- eotdl/curation/stac/extensions/__init__.py +6 -2
- eotdl/curation/stac/extensions/base.py +8 -4
- eotdl/curation/stac/extensions/dem.py +6 -3
- eotdl/curation/stac/extensions/eo.py +10 -6
- eotdl/curation/stac/extensions/label/__init__.py +5 -1
- eotdl/curation/stac/extensions/label/base.py +40 -26
- eotdl/curation/stac/extensions/label/image_name_labeler.py +64 -43
- eotdl/curation/stac/extensions/label/scaneo.py +59 -56
- eotdl/curation/stac/extensions/ml_dataset.py +154 -56
- eotdl/curation/stac/extensions/projection.py +11 -9
- eotdl/curation/stac/extensions/raster.py +22 -14
- eotdl/curation/stac/extensions/sar.py +12 -7
- eotdl/curation/stac/extent.py +67 -40
- eotdl/curation/stac/parsers.py +18 -10
- eotdl/curation/stac/stac.py +81 -62
- eotdl/datasets/__init__.py +1 -1
- eotdl/datasets/download.py +42 -55
- eotdl/datasets/ingest.py +68 -11
- eotdl/files/__init__.py +1 -1
- eotdl/files/ingest.py +3 -1
- eotdl/models/download.py +1 -1
- eotdl/repos/AuthAPIRepo.py +0 -1
- eotdl/repos/DatasetsAPIRepo.py +22 -146
- eotdl/repos/FilesAPIRepo.py +7 -92
- eotdl/repos/ModelsAPIRepo.py +0 -1
- eotdl/tools/__init__.py +5 -1
- eotdl/tools/geo_utils.py +78 -48
- eotdl/tools/metadata.py +13 -11
- eotdl/tools/paths.py +14 -14
- eotdl/tools/stac.py +36 -31
- eotdl/tools/time_utils.py +53 -26
- eotdl/tools/tools.py +84 -50
- {eotdl-2023.11.2.post5.dist-info → eotdl-2023.11.3.post2.dist-info}/METADATA +5 -3
- eotdl-2023.11.3.post2.dist-info/RECORD +84 -0
- eotdl-2023.11.2.post5.dist-info/RECORD +0 -84
- {eotdl-2023.11.2.post5.dist-info → eotdl-2023.11.3.post2.dist-info}/WHEEL +0 -0
- {eotdl-2023.11.2.post5.dist-info → eotdl-2023.11.3.post2.dist-info}/entry_points.txt +0 -0
@@ -2,7 +2,11 @@
|
|
2
2
|
Parameters to access Airbus data
|
3
3
|
"""
|
4
4
|
|
5
|
-
|
5
|
+
|
6
|
+
class AirbusURL:
|
7
|
+
"""
|
8
|
+
AIRBUS URLs
|
9
|
+
"""
|
6
10
|
PRICES = "https://data.api.oneatlas.airbus.com/api/v1/prices"
|
7
11
|
ORDERS = "https://data.api.oneatlas.airbus.com/api/v1/orders"
|
8
12
|
SEARCH = "https://search.foundation.api.oneatlas.airbus.com/api/v2/opensearch?constellation=SPOT"
|
@@ -10,16 +14,27 @@ class AirbusURL():
|
|
10
14
|
ACCOUNT = "https://data.api.oneatlas.airbus.com/api/v1/me"
|
11
15
|
ROLES = "https://data.api.oneatlas.airbus.com/api/v1/me/services"
|
12
16
|
|
17
|
+
|
13
18
|
# Types are defined at: https://www.geoapi-airbusds.com/api-catalog-v2/oad-living-library/tutorials/#order-an-individual-product
|
14
19
|
|
15
|
-
|
20
|
+
|
21
|
+
class AirbusProductType:
|
22
|
+
"""
|
23
|
+
Airbus product types
|
24
|
+
"""
|
16
25
|
MULTISPECTRAL = "multiSpectral"
|
17
26
|
|
18
27
|
|
19
|
-
class AirbusRadiometricProcessing
|
28
|
+
class AirbusRadiometricProcessing:
|
29
|
+
"""
|
30
|
+
Airbus radiometric processing
|
31
|
+
"""
|
20
32
|
REFLECTANCE = "REFLECTANCE"
|
21
33
|
|
22
34
|
|
23
|
-
class AirbusImageFormat
|
35
|
+
class AirbusImageFormat:
|
36
|
+
"""
|
37
|
+
Airbus image format
|
38
|
+
"""
|
24
39
|
GEOTIFF = "image/geotiff"
|
25
40
|
JP2 = "image/jp2"
|
eotdl/access/airbus/utils.py
CHANGED
@@ -6,24 +6,29 @@ import requests
|
|
6
6
|
|
7
7
|
|
8
8
|
def get_airbus_access_token(api_key: str) -> str:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
9
|
+
"""
|
10
|
+
Get Airbus access token
|
11
|
+
|
12
|
+
Returns:
|
13
|
+
str: access token
|
14
|
+
"""
|
15
|
+
headers = {
|
16
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
17
|
+
}
|
18
|
+
|
19
|
+
data = [
|
20
|
+
("apikey", api_key),
|
21
|
+
("grant_type", "api_key"),
|
22
|
+
("client_id", "IDP"),
|
23
|
+
]
|
24
|
+
|
25
|
+
response = requests.post(
|
26
|
+
"https://authenticate.foundation.api.oneatlas.airbus.com/auth/realms/IDP/protocol/openid-connect/token",
|
27
|
+
headers=headers,
|
28
|
+
data=data,
|
29
|
+
timeout=60
|
30
|
+
)
|
31
|
+
|
32
|
+
access_token = response.json()["access_token"]
|
33
|
+
|
34
|
+
return access_token
|
eotdl/access/download.py
CHANGED
@@ -1,16 +1,28 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
"""
|
2
|
+
Download imagery
|
3
|
+
"""
|
3
4
|
|
4
|
-
from shutil import rmtree
|
5
5
|
from datetime import datetime
|
6
6
|
from typing import Union, List
|
7
7
|
|
8
|
+
from .sentinelhub import (
|
9
|
+
SHClient,
|
10
|
+
SH_PARAMETERS_DICT,
|
11
|
+
evaluate_sentinel_parameters,
|
12
|
+
imagery_from_tmp_to_dir,
|
13
|
+
)
|
14
|
+
from .search import search_sentinel_imagery
|
15
|
+
|
8
16
|
|
9
|
-
def download_sentinel_imagery(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
def download_sentinel_imagery(
|
18
|
+
output: str,
|
19
|
+
time_interval: Union[str, datetime, List[Union[str, datetime]]],
|
20
|
+
bounding_box: List[Union[int, float]],
|
21
|
+
sensor: str,
|
22
|
+
) -> None:
|
23
|
+
"""
|
24
|
+
Download Sentinel imagery
|
25
|
+
"""
|
14
26
|
evaluate_sentinel_parameters(sensor, time_interval, bounding_box, output)
|
15
27
|
|
16
28
|
client = SHClient()
|
@@ -21,11 +33,15 @@ def download_sentinel_imagery(output: str,
|
|
21
33
|
imagery_from_tmp_to_dir(output)
|
22
34
|
|
23
35
|
|
24
|
-
def search_and_download_sentinel_imagery(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
36
|
+
def search_and_download_sentinel_imagery(
|
37
|
+
output: str,
|
38
|
+
time_interval: Union[str, datetime, List[Union[str, datetime]]],
|
39
|
+
bounding_box: List[Union[int, float]],
|
40
|
+
sensor: str,
|
41
|
+
) -> None:
|
42
|
+
"""
|
43
|
+
Search and download Sentinel imagery
|
44
|
+
"""
|
29
45
|
evaluate_sentinel_parameters(sensor, time_interval, bounding_box, output)
|
30
46
|
|
31
47
|
client = SHClient()
|
@@ -34,7 +50,7 @@ def search_and_download_sentinel_imagery(output: str,
|
|
34
50
|
results = search_sentinel_imagery(time_interval, bounding_box, sensor)
|
35
51
|
timestamps = [date.strftime("%Y-%m-%d") for date in results.get_timestamps()]
|
36
52
|
|
37
|
-
requests_list =
|
53
|
+
requests_list = []
|
38
54
|
for date in timestamps:
|
39
55
|
requests_list.append(client.request_data(date, bounding_box, parameters))
|
40
56
|
client.download_data(requests_list)
|
eotdl/access/search.py
CHANGED
@@ -1,13 +1,24 @@
|
|
1
|
-
|
1
|
+
"""
|
2
|
+
Search imagery
|
3
|
+
"""
|
4
|
+
|
2
5
|
from typing import Union, List
|
3
6
|
from datetime import datetime
|
4
7
|
|
8
|
+
from .sentinelhub import SHClient, SH_PARAMETERS_DICT, evaluate_sentinel_parameters
|
9
|
+
|
5
10
|
|
6
|
-
def search_sentinel_imagery(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
def search_sentinel_imagery(
|
12
|
+
time_interval: Union[str, datetime, List[Union[str, datetime]]],
|
13
|
+
bounding_box: List[Union[int, float]],
|
14
|
+
sensor: str,
|
15
|
+
) -> None:
|
16
|
+
"""
|
17
|
+
Search Sentinel imagery
|
18
|
+
"""
|
19
|
+
evaluate_sentinel_parameters(
|
20
|
+
sensor, time_interval, bounding_box, output_needed=False
|
21
|
+
)
|
11
22
|
|
12
23
|
client = SHClient()
|
13
24
|
parameters = SH_PARAMETERS_DICT[sensor]()
|
@@ -1,4 +1,8 @@
|
|
1
|
+
"""
|
2
|
+
Sentinel-Hub data access module.
|
3
|
+
"""
|
4
|
+
|
1
5
|
from .client import SHClient
|
2
6
|
from .parameters import SHParameters, SH_PARAMETERS_DICT
|
3
7
|
from .evalscripts import EvalScripts
|
4
|
-
from .utils import evaluate_sentinel_parameters, imagery_from_tmp_to_dir
|
8
|
+
from .utils import evaluate_sentinel_parameters, imagery_from_tmp_to_dir
|
@@ -5,14 +5,16 @@ Module for managing the Sentinel Hub configuration and data access
|
|
5
5
|
import json
|
6
6
|
from os import getenv
|
7
7
|
from os.path import exists
|
8
|
-
from sentinelhub import (
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
from sentinelhub import (
|
9
|
+
SHConfig,
|
10
|
+
SentinelHubCatalog,
|
11
|
+
BBox,
|
12
|
+
bbox_to_dimensions,
|
13
|
+
CRS,
|
14
|
+
SentinelHubRequest,
|
15
|
+
SentinelHubDownloadClient,
|
16
|
+
MimeType,
|
17
|
+
)
|
16
18
|
|
17
19
|
from ...repos.AuthRepo import AuthRepo
|
18
20
|
from .parameters import SHParameters
|
@@ -20,86 +22,87 @@ from ...tools.time_utils import prepare_time_interval
|
|
20
22
|
from ...tools.geo_utils import compute_image_size
|
21
23
|
|
22
24
|
|
23
|
-
class SHClient
|
25
|
+
class SHClient:
|
24
26
|
"""
|
25
27
|
Client class to manage the Sentinel Hub Python interface.
|
26
28
|
"""
|
27
29
|
|
28
|
-
def __init__(self
|
29
|
-
|
30
|
-
"""
|
31
|
-
"""
|
30
|
+
def __init__(self) -> None:
|
31
|
+
""" """
|
32
32
|
self.config = SHConfig()
|
33
|
-
if getenv(
|
33
|
+
if getenv("SH_CLIENT_ID") and getenv("SH_CLIENT_SECRET"):
|
34
34
|
# If the user has provided the credentials in a .env file, we should save them
|
35
|
-
self.config.sh_client_id = getenv(
|
36
|
-
self.config.sh_client_secret = getenv(
|
35
|
+
self.config.sh_client_id = getenv("SH_CLIENT_ID")
|
36
|
+
self.config.sh_client_secret = getenv("SH_CLIENT_SECRET")
|
37
37
|
else:
|
38
38
|
# If the user has not provided the credentials, we should check if
|
39
39
|
# the user is logged in
|
40
40
|
auth_repo = AuthRepo()
|
41
41
|
creds_file = auth_repo.creds_path
|
42
42
|
if not exists(creds_file):
|
43
|
-
raise ValueError(
|
43
|
+
raise ValueError(
|
44
|
+
"Your are not logged in and have not provided Sentinel Hub credentials. Please, crete a .env file with your SH_CLIENT_ID and SH_CLIENT_SECRET, or login"
|
45
|
+
)
|
44
46
|
else:
|
45
|
-
|
46
|
-
|
47
|
-
|
47
|
+
with open(creds_file, "r", encoding="utd-8") as f:
|
48
|
+
creds = json.load(f)
|
49
|
+
if (
|
50
|
+
"SH_CLIENT_ID" not in creds.keys()
|
51
|
+
or "SH_CLIENT_SECRET" not in creds.keys()
|
52
|
+
):
|
53
|
+
raise ValueError(
|
54
|
+
"If you already had a Sentinel HUB account before accepting the Terms and Conditions, your SH credentials will NOT appear here. You can retrieve them from you Sentinel HUB dashboard)"
|
55
|
+
)
|
48
56
|
else:
|
49
|
-
self.config.sh_client_id = creds[
|
50
|
-
self.config.sh_client_secret = creds[
|
57
|
+
self.config.sh_client_id = creds["SH_CLIENT_ID"]
|
58
|
+
self.config.sh_client_secret = creds["SH_CLIENT_SECRET"]
|
51
59
|
self.catalog = SentinelHubCatalog(config=self.config)
|
52
|
-
self.tmp_dir =
|
60
|
+
self.tmp_dir = "/tmp/sentinelhub"
|
53
61
|
|
54
|
-
def search_data(
|
55
|
-
|
56
|
-
|
57
|
-
parameters: SHParameters
|
58
|
-
) -> list:
|
62
|
+
def search_data(
|
63
|
+
self, bounding_box: list, time_interval: list, parameters: SHParameters
|
64
|
+
) -> list:
|
59
65
|
"""
|
66
|
+
Search data from Sentinel Hub
|
60
67
|
"""
|
61
68
|
search_iterator = self.catalog.search(
|
62
69
|
parameters.DATA_COLLECTION,
|
63
70
|
bbox=BBox(bounding_box, crs=CRS.WGS84),
|
64
71
|
time=time_interval,
|
65
72
|
filter=parameters.FILTER,
|
66
|
-
fields=parameters.FIELDS
|
73
|
+
fields=parameters.FIELDS,
|
67
74
|
)
|
68
75
|
|
69
76
|
return search_iterator
|
70
|
-
|
71
|
-
def request_data(
|
72
|
-
|
73
|
-
|
74
|
-
parameters: SHParameters
|
75
|
-
) -> list:
|
77
|
+
|
78
|
+
def request_data(
|
79
|
+
self, time_interval, bounding_box: list, parameters: SHParameters
|
80
|
+
) -> list:
|
76
81
|
"""
|
82
|
+
Request data from Sentinel Hub
|
77
83
|
"""
|
78
84
|
time_interval = prepare_time_interval(time_interval)
|
79
|
-
bounding_box,
|
85
|
+
bounding_box, _ = compute_image_size(bounding_box, parameters)
|
80
86
|
|
81
87
|
return SentinelHubRequest(
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
)
|
90
|
-
],
|
91
|
-
responses=[
|
92
|
-
SentinelHubRequest.output_response("default", MimeType.TIFF)
|
93
|
-
],
|
94
|
-
bbox=bounding_box,
|
95
|
-
size=bbox_to_dimensions(bounding_box, parameters.RESOLUTION),
|
96
|
-
config=self.config,
|
88
|
+
data_folder=self.tmp_dir,
|
89
|
+
evalscript=parameters.EVALSCRIPT,
|
90
|
+
input_data=[
|
91
|
+
SentinelHubRequest.input_data(
|
92
|
+
data_collection=parameters.DATA_COLLECTION,
|
93
|
+
time_interval=time_interval,
|
94
|
+
mosaicking_order=parameters.MOSAICKING_ORDER,
|
97
95
|
)
|
96
|
+
],
|
97
|
+
responses=[SentinelHubRequest.output_response("default", MimeType.TIFF)],
|
98
|
+
bbox=bounding_box,
|
99
|
+
size=bbox_to_dimensions(bounding_box, parameters.RESOLUTION),
|
100
|
+
config=self.config,
|
101
|
+
)
|
98
102
|
|
99
|
-
def download_data(self,
|
100
|
-
requests: list
|
101
|
-
) -> list:
|
103
|
+
def download_data(self, requests: list) -> list:
|
102
104
|
"""
|
105
|
+
Download data from Sentinel Hub
|
103
106
|
"""
|
104
107
|
download_client = SentinelHubDownloadClient(config=self.config)
|
105
108
|
if not isinstance(requests, list):
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
"""
|
2
2
|
Evalscripts for Sentinel Hub requests
|
3
|
-
|
3
|
+
"""
|
4
4
|
|
5
5
|
|
6
6
|
class EvalScripts:
|
@@ -26,24 +26,24 @@ class EvalScripts:
|
|
26
26
|
return [sample.VH, sample.VV];
|
27
27
|
}
|
28
28
|
"""
|
29
|
-
|
29
|
+
|
30
30
|
SENTINEL_2_L1C = """
|
31
31
|
//VERSION=3
|
32
32
|
function setup() {
|
33
33
|
return {
|
34
34
|
input: [{
|
35
|
-
bands: ["B01",
|
36
|
-
"B02",
|
37
|
-
"B03",
|
35
|
+
bands: ["B01",
|
36
|
+
"B02",
|
37
|
+
"B03",
|
38
38
|
"B04",
|
39
|
-
"B05",
|
40
|
-
"B06",
|
41
|
-
"B07",
|
42
|
-
"B08",
|
39
|
+
"B05",
|
40
|
+
"B06",
|
41
|
+
"B07",
|
42
|
+
"B08",
|
43
43
|
"B8A",
|
44
44
|
"B09",
|
45
45
|
"B10",
|
46
|
-
"B11",
|
46
|
+
"B11",
|
47
47
|
"B12"],
|
48
48
|
units: "DN"
|
49
49
|
}],
|
@@ -59,39 +59,38 @@ class EvalScripts:
|
|
59
59
|
}
|
60
60
|
|
61
61
|
function evaluatePixel(sample) {
|
62
|
-
return [sample.B01,
|
63
|
-
sample.B02,
|
64
|
-
sample.B03,
|
65
|
-
sample.B04,
|
66
|
-
sample.B05,
|
67
|
-
sample.B06,
|
68
|
-
sample.B07,
|
69
|
-
sample.B08,
|
62
|
+
return [sample.B01,
|
63
|
+
sample.B02,
|
64
|
+
sample.B03,
|
65
|
+
sample.B04,
|
66
|
+
sample.B05,
|
67
|
+
sample.B06,
|
68
|
+
sample.B07,
|
69
|
+
sample.B08,
|
70
70
|
sample.B8A,
|
71
71
|
sample.B09,
|
72
72
|
sample.B10,
|
73
|
-
sample.B11,
|
73
|
+
sample.B11,
|
74
74
|
sample.B12];
|
75
75
|
}
|
76
76
|
"""
|
77
77
|
|
78
|
-
|
79
78
|
SENTINEL_2_L2A = """
|
80
79
|
//VERSION=3
|
81
80
|
function setup() {
|
82
81
|
return {
|
83
82
|
input: [{
|
84
|
-
bands: ["B01",
|
85
|
-
"B02",
|
86
|
-
"B03",
|
83
|
+
bands: ["B01",
|
84
|
+
"B02",
|
85
|
+
"B03",
|
87
86
|
"B04",
|
88
|
-
"B05",
|
89
|
-
"B06",
|
90
|
-
"B07",
|
91
|
-
"B08",
|
87
|
+
"B05",
|
88
|
+
"B06",
|
89
|
+
"B07",
|
90
|
+
"B08",
|
92
91
|
"B8A",
|
93
92
|
"B09",
|
94
|
-
"B11",
|
93
|
+
"B11",
|
95
94
|
"B12"],
|
96
95
|
units: "DN"
|
97
96
|
}],
|
@@ -103,21 +102,21 @@ class EvalScripts:
|
|
103
102
|
}
|
104
103
|
|
105
104
|
function evaluatePixel(sample) {
|
106
|
-
return [sample.B01,
|
107
|
-
sample.B02,
|
108
|
-
sample.B03,
|
109
|
-
sample.B04,
|
110
|
-
sample.B05,
|
111
|
-
sample.B06,
|
112
|
-
sample.B07,
|
113
|
-
sample.B08,
|
105
|
+
return [sample.B01,
|
106
|
+
sample.B02,
|
107
|
+
sample.B03,
|
108
|
+
sample.B04,
|
109
|
+
sample.B05,
|
110
|
+
sample.B06,
|
111
|
+
sample.B07,
|
112
|
+
sample.B08,
|
114
113
|
sample.B8A,
|
115
114
|
sample.B09,
|
116
|
-
sample.B11,
|
115
|
+
sample.B11,
|
117
116
|
sample.B12];
|
118
117
|
}
|
119
118
|
"""
|
120
|
-
|
119
|
+
|
121
120
|
DEM = """
|
122
121
|
//VERSION=3
|
123
122
|
|
@@ -8,50 +8,70 @@ from .evalscripts import EvalScripts
|
|
8
8
|
|
9
9
|
|
10
10
|
class SHParameters:
|
11
|
-
|
11
|
+
"""
|
12
|
+
Sentinel Hub Parameters base class
|
13
|
+
"""
|
12
14
|
def __init__(self):
|
13
15
|
pass
|
14
16
|
|
15
17
|
|
16
18
|
class SHS2L2AParameters(SHParameters):
|
19
|
+
"""
|
20
|
+
Sentinel-2-L2A parameters
|
21
|
+
"""
|
17
22
|
DATA_COLLECTION = DataCollection.SENTINEL2_L2A
|
18
23
|
RESOLUTION = 10
|
19
24
|
MOSAICKING_ORDER = MosaickingOrder.LEAST_CC
|
20
25
|
EVALSCRIPT = EvalScripts.SENTINEL_2_L2A
|
21
|
-
FIELDS = {
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
FIELDS = {
|
27
|
+
"include": ["id", "properties.datetime", "properties.eo:cloud_cover"],
|
28
|
+
"exclude": [],
|
29
|
+
}
|
25
30
|
FILTER = None
|
26
31
|
|
27
32
|
|
28
33
|
class SHS2L1CParameters(SHParameters):
|
34
|
+
"""
|
35
|
+
Sentinel-2-L1C parameters
|
36
|
+
"""
|
29
37
|
DATA_COLLECTION = DataCollection.SENTINEL2_L1C
|
30
38
|
RESOLUTION = 10
|
31
39
|
MOSAICKING_ORDER = MosaickingOrder.LEAST_CC
|
32
40
|
EVALSCRIPT = EvalScripts.SENTINEL_2_L1C
|
33
|
-
FIELDS = {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
41
|
+
FIELDS = {
|
42
|
+
"include": ["id", "properties.datetime", "properties.eo:cloud_cover"],
|
43
|
+
"exclude": [],
|
44
|
+
}
|
45
|
+
|
38
46
|
|
39
47
|
class SHS1Parameters(SHParameters):
|
48
|
+
"""
|
49
|
+
Sentinel-1 parameters
|
50
|
+
"""
|
40
51
|
DATA_COLLECTION = DataCollection.SENTINEL1
|
41
52
|
RESOLUTION = 3
|
42
53
|
EVALSCRIPT = EvalScripts.SENTINEL_1
|
43
|
-
FIELDS =
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
54
|
+
FIELDS = (
|
55
|
+
{
|
56
|
+
"include": [
|
57
|
+
"id",
|
58
|
+
"properties.datetime",
|
59
|
+
"sar:instrument_mode",
|
60
|
+
"s1:polarization",
|
61
|
+
"sat:orbit_state",
|
62
|
+
"s1:resolution",
|
63
|
+
"s1:timeliness",
|
64
|
+
],
|
65
|
+
"exclude": [],
|
66
|
+
},
|
67
|
+
)
|
51
68
|
FILTER = None
|
52
69
|
|
53
70
|
|
54
71
|
class SHDEMParameters(SHParameters):
|
72
|
+
"""
|
73
|
+
Copernicus DEM parameters
|
74
|
+
"""
|
55
75
|
DATA_COLLECTION = DataCollection.DEM_COPERNICUS_30
|
56
76
|
RESOLUTION = 3
|
57
77
|
MOSAICKING_ORDER = None
|
@@ -60,11 +80,11 @@ class SHDEMParameters(SHParameters):
|
|
60
80
|
FIELDS = None
|
61
81
|
|
62
82
|
|
63
|
-
SUPPORTED_SENSORS = (
|
83
|
+
SUPPORTED_SENSORS = ("sentinel-1-grd", "sentinel-2-l1c", "sentinel-2-l2a", "dem")
|
64
84
|
|
65
85
|
SH_PARAMETERS_DICT = {
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
86
|
+
"sentinel-1-grd": SHS1Parameters,
|
87
|
+
"sentinel-2-l1c": SHS2L1CParameters,
|
88
|
+
"sentinel-2-l2a": SHS2L2AParameters,
|
89
|
+
"dem": SHDEMParameters,
|
70
90
|
}
|