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.
Files changed (58) hide show
  1. eotdl/__init__.py +1 -1
  2. eotdl/access/__init__.py +6 -3
  3. eotdl/access/airbus/__init__.py +5 -1
  4. eotdl/access/airbus/client.py +356 -338
  5. eotdl/access/airbus/parameters.py +19 -4
  6. eotdl/access/airbus/utils.py +26 -21
  7. eotdl/access/download.py +30 -14
  8. eotdl/access/search.py +17 -6
  9. eotdl/access/sentinelhub/__init__.py +5 -1
  10. eotdl/access/sentinelhub/client.py +57 -54
  11. eotdl/access/sentinelhub/evalscripts.py +38 -39
  12. eotdl/access/sentinelhub/parameters.py +43 -23
  13. eotdl/access/sentinelhub/utils.py +38 -28
  14. eotdl/auth/errors.py +2 -1
  15. eotdl/commands/auth.py +3 -3
  16. eotdl/curation/__init__.py +5 -1
  17. eotdl/curation/stac/__init__.py +5 -1
  18. eotdl/curation/stac/assets.py +55 -32
  19. eotdl/curation/stac/dataframe.py +20 -14
  20. eotdl/curation/stac/dataframe_bck.py +2 -2
  21. eotdl/curation/stac/dataframe_labeling.py +15 -12
  22. eotdl/curation/stac/extensions/__init__.py +6 -2
  23. eotdl/curation/stac/extensions/base.py +8 -4
  24. eotdl/curation/stac/extensions/dem.py +6 -3
  25. eotdl/curation/stac/extensions/eo.py +10 -6
  26. eotdl/curation/stac/extensions/label/__init__.py +5 -1
  27. eotdl/curation/stac/extensions/label/base.py +40 -26
  28. eotdl/curation/stac/extensions/label/image_name_labeler.py +64 -43
  29. eotdl/curation/stac/extensions/label/scaneo.py +59 -56
  30. eotdl/curation/stac/extensions/ml_dataset.py +154 -56
  31. eotdl/curation/stac/extensions/projection.py +11 -9
  32. eotdl/curation/stac/extensions/raster.py +22 -14
  33. eotdl/curation/stac/extensions/sar.py +12 -7
  34. eotdl/curation/stac/extent.py +67 -40
  35. eotdl/curation/stac/parsers.py +18 -10
  36. eotdl/curation/stac/stac.py +81 -62
  37. eotdl/datasets/__init__.py +1 -1
  38. eotdl/datasets/download.py +42 -55
  39. eotdl/datasets/ingest.py +68 -11
  40. eotdl/files/__init__.py +1 -1
  41. eotdl/files/ingest.py +3 -1
  42. eotdl/models/download.py +1 -1
  43. eotdl/repos/AuthAPIRepo.py +0 -1
  44. eotdl/repos/DatasetsAPIRepo.py +22 -146
  45. eotdl/repos/FilesAPIRepo.py +7 -92
  46. eotdl/repos/ModelsAPIRepo.py +0 -1
  47. eotdl/tools/__init__.py +5 -1
  48. eotdl/tools/geo_utils.py +78 -48
  49. eotdl/tools/metadata.py +13 -11
  50. eotdl/tools/paths.py +14 -14
  51. eotdl/tools/stac.py +36 -31
  52. eotdl/tools/time_utils.py +53 -26
  53. eotdl/tools/tools.py +84 -50
  54. {eotdl-2023.11.2.post5.dist-info → eotdl-2023.11.3.post2.dist-info}/METADATA +5 -3
  55. eotdl-2023.11.3.post2.dist-info/RECORD +84 -0
  56. eotdl-2023.11.2.post5.dist-info/RECORD +0 -84
  57. {eotdl-2023.11.2.post5.dist-info → eotdl-2023.11.3.post2.dist-info}/WHEEL +0 -0
  58. {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
- class AirbusURL():
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
- class AirbusProductType():
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"
@@ -6,24 +6,29 @@ import requests
6
6
 
7
7
 
8
8
  def get_airbus_access_token(api_key: str) -> str:
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('https://authenticate.foundation.api.oneatlas.airbus.com/auth/realms/IDP/protocol/openid-connect/token', headers=headers, data=data)
26
-
27
- access_token = response.json()['access_token']
28
-
29
- return access_token
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
- from .sentinelhub import SHClient, SH_PARAMETERS_DICT, evaluate_sentinel_parameters, imagery_from_tmp_to_dir
2
- from .search import search_sentinel_imagery
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(output: str,
10
- time_interval: Union[str, datetime, List[Union[str, datetime]]],
11
- bounding_box: List[Union[int, float]],
12
- sensor: str,
13
- ) -> None:
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(output: str,
25
- time_interval: Union[str, datetime, List[Union[str, datetime]]],
26
- bounding_box: List[Union[int, float]],
27
- sensor: str,
28
- ) -> None:
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 = 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
- from .sentinelhub import SHClient, SH_PARAMETERS_DICT, evaluate_sentinel_parameters
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(time_interval: Union[str, datetime, List[Union[str, datetime]]],
7
- bounding_box: List[Union[int, float]],
8
- sensor: str,
9
- ) -> None:
10
- evaluate_sentinel_parameters(sensor, time_interval, bounding_box, output_needed=False)
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 (SHConfig,
9
- SentinelHubCatalog,
10
- BBox,
11
- bbox_to_dimensions,
12
- CRS,
13
- SentinelHubRequest,
14
- SentinelHubDownloadClient,
15
- MimeType)
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
- ) -> None:
30
- """
31
- """
30
+ def __init__(self) -> None:
31
+ """ """
32
32
  self.config = SHConfig()
33
- if getenv('SH_CLIENT_ID') and getenv('SH_CLIENT_SECRET'):
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('SH_CLIENT_ID')
36
- self.config.sh_client_secret = getenv('SH_CLIENT_SECRET')
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('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')
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
- creds = json.load(open(creds_file, 'r'))
46
- if not 'SH_CLIENT_ID' in creds.keys() or not 'SH_CLIENT_SECRET' in creds.keys():
47
- raise ValueError('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)')
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['SH_CLIENT_ID']
50
- self.config.sh_client_secret = creds['SH_CLIENT_SECRET']
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 = '/tmp/sentinelhub'
60
+ self.tmp_dir = "/tmp/sentinelhub"
53
61
 
54
- def search_data(self,
55
- bounding_box: list,
56
- time_interval: list,
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(self,
72
- time_interval,
73
- bounding_box: list,
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, bounding_box_size = compute_image_size(bounding_box, parameters)
85
+ bounding_box, _ = compute_image_size(bounding_box, parameters)
80
86
 
81
87
  return SentinelHubRequest(
82
- data_folder=self.tmp_dir,
83
- evalscript=parameters.EVALSCRIPT,
84
- input_data=[
85
- SentinelHubRequest.input_data(
86
- data_collection=parameters.DATA_COLLECTION,
87
- time_interval=time_interval,
88
- mosaicking_order=parameters.MOSAICKING_ORDER,
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 = {"include": ["id",
22
- "properties.datetime",
23
- "properties.eo:cloud_cover"],
24
- "exclude": []}
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 = {"include": ["id",
34
- "properties.datetime",
35
- "properties.eo:cloud_cover"],
36
- "exclude": []}
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 = {"include": ["id",
44
- "properties.datetime",
45
- "sar:instrument_mode",
46
- "s1:polarization",
47
- "sat:orbit_state",
48
- "s1:resolution",
49
- "s1:timeliness"],
50
- "exclude": []},
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 = ('sentinel-1-grd', 'sentinel-2-l1c', 'sentinel-2-l2a', 'dem')
83
+ SUPPORTED_SENSORS = ("sentinel-1-grd", "sentinel-2-l1c", "sentinel-2-l2a", "dem")
64
84
 
65
85
  SH_PARAMETERS_DICT = {
66
- 'sentinel-1-grd': SHS1Parameters,
67
- 'sentinel-2-l1c': SHS2L1CParameters,
68
- 'sentinel-2-l2a': SHS2L2AParameters,
69
- 'dem': SHDEMParameters
86
+ "sentinel-1-grd": SHS1Parameters,
87
+ "sentinel-2-l1c": SHS2L1CParameters,
88
+ "sentinel-2-l2a": SHS2L2AParameters,
89
+ "dem": SHDEMParameters,
70
90
  }