eodag 3.10.0__py3-none-any.whl → 3.10.1__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.
- eodag/api/core.py +8 -2
- eodag/api/product/_product.py +9 -13
- eodag/api/product/metadata_mapping.py +7 -4
- eodag/plugins/crunch/filter_latest_intersect.py +1 -0
- eodag/plugins/crunch/filter_overlap.py +3 -7
- eodag/plugins/download/aws.py +1 -1
- eodag/plugins/search/build_search_result.py +41 -14
- eodag/plugins/search/cop_marine.py +6 -0
- eodag/resources/product_types.yml +81 -36
- eodag/resources/providers.yml +39 -32
- eodag/types/queryables.py +1 -0
- eodag/utils/__init__.py +44 -2
- eodag/utils/dates.py +12 -0
- {eodag-3.10.0.dist-info → eodag-3.10.1.dist-info}/METADATA +14 -3
- {eodag-3.10.0.dist-info → eodag-3.10.1.dist-info}/RECORD +19 -19
- {eodag-3.10.0.dist-info → eodag-3.10.1.dist-info}/WHEEL +0 -0
- {eodag-3.10.0.dist-info → eodag-3.10.1.dist-info}/entry_points.txt +0 -0
- {eodag-3.10.0.dist-info → eodag-3.10.1.dist-info}/licenses/LICENSE +0 -0
- {eodag-3.10.0.dist-info → eodag-3.10.1.dist-info}/top_level.txt +0 -0
eodag/api/core.py
CHANGED
|
@@ -56,7 +56,7 @@ from eodag.plugins.search import PreparedSearch
|
|
|
56
56
|
from eodag.plugins.search.build_search_result import MeteoblueSearch
|
|
57
57
|
from eodag.plugins.search.qssearch import PostJsonSearch
|
|
58
58
|
from eodag.types import model_fields_to_annotated
|
|
59
|
-
from eodag.types.queryables import CommonQueryables, QueryablesDict
|
|
59
|
+
from eodag.types.queryables import CommonQueryables, Queryables, QueryablesDict
|
|
60
60
|
from eodag.utils import (
|
|
61
61
|
DEFAULT_DOWNLOAD_TIMEOUT,
|
|
62
62
|
DEFAULT_DOWNLOAD_WAIT,
|
|
@@ -2318,8 +2318,14 @@ class EODataAccessGateway:
|
|
|
2318
2318
|
plugin.provider,
|
|
2319
2319
|
)
|
|
2320
2320
|
|
|
2321
|
+
# use queryables aliases
|
|
2322
|
+
kwargs_alias = {**kwargs}
|
|
2323
|
+
for search_param, field_info in Queryables.model_fields.items():
|
|
2324
|
+
if search_param in kwargs and field_info.alias:
|
|
2325
|
+
kwargs_alias[field_info.alias] = kwargs_alias.pop(search_param)
|
|
2326
|
+
|
|
2321
2327
|
plugin_queryables = plugin.list_queryables(
|
|
2322
|
-
|
|
2328
|
+
kwargs_alias,
|
|
2323
2329
|
available_product_types,
|
|
2324
2330
|
product_type_configs,
|
|
2325
2331
|
product_type,
|
eodag/api/product/_product.py
CHANGED
|
@@ -48,6 +48,7 @@ from eodag.api.product.metadata_mapping import (
|
|
|
48
48
|
from eodag.utils import (
|
|
49
49
|
DEFAULT_DOWNLOAD_TIMEOUT,
|
|
50
50
|
DEFAULT_DOWNLOAD_WAIT,
|
|
51
|
+
DEFAULT_SHAPELY_GEOMETRY,
|
|
51
52
|
DEFAULT_STREAM_REQUESTS_TIMEOUT,
|
|
52
53
|
USER_AGENT,
|
|
53
54
|
ProgressCallback,
|
|
@@ -67,12 +68,6 @@ if TYPE_CHECKING:
|
|
|
67
68
|
from eodag.types.download_args import DownloadConf
|
|
68
69
|
from eodag.utils import Unpack
|
|
69
70
|
|
|
70
|
-
try:
|
|
71
|
-
from shapely.errors import GEOSException
|
|
72
|
-
except ImportError:
|
|
73
|
-
# shapely < 2.0 compatibility
|
|
74
|
-
from shapely.errors import TopologicalError as GEOSException
|
|
75
|
-
|
|
76
71
|
|
|
77
72
|
logger = logging.getLogger("eodag.product")
|
|
78
73
|
|
|
@@ -136,6 +131,7 @@ class EOProduct:
|
|
|
136
131
|
if key != "geometry"
|
|
137
132
|
and value != NOT_MAPPED
|
|
138
133
|
and NOT_AVAILABLE not in str(value)
|
|
134
|
+
and value is not None
|
|
139
135
|
}
|
|
140
136
|
if "geometry" not in properties or (
|
|
141
137
|
(
|
|
@@ -144,17 +140,17 @@ class EOProduct:
|
|
|
144
140
|
)
|
|
145
141
|
and "defaultGeometry" not in properties
|
|
146
142
|
):
|
|
147
|
-
|
|
148
|
-
f"No geometry available to build EOProduct(id={properties.get('id')}, provider={provider})"
|
|
149
|
-
)
|
|
143
|
+
product_geometry = DEFAULT_SHAPELY_GEOMETRY
|
|
150
144
|
elif not properties["geometry"] or properties["geometry"] == NOT_AVAILABLE:
|
|
151
145
|
product_geometry = properties.pop("defaultGeometry", DEFAULT_GEOMETRY)
|
|
152
146
|
else:
|
|
153
147
|
product_geometry = properties["geometry"]
|
|
154
148
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
149
|
+
geometry_obj = get_geometry_from_various(geometry=product_geometry)
|
|
150
|
+
# whole world as default geometry
|
|
151
|
+
if geometry_obj is None:
|
|
152
|
+
geometry_obj = DEFAULT_SHAPELY_GEOMETRY
|
|
153
|
+
self.geometry = self.search_intersection = geometry_obj
|
|
158
154
|
|
|
159
155
|
self.search_kwargs = kwargs
|
|
160
156
|
if self.search_kwargs.get("geometry") is not None:
|
|
@@ -163,7 +159,7 @@ class EOProduct:
|
|
|
163
159
|
)
|
|
164
160
|
try:
|
|
165
161
|
self.search_intersection = self.geometry.intersection(searched_geom)
|
|
166
|
-
except
|
|
162
|
+
except ShapelyError:
|
|
167
163
|
logger.warning(
|
|
168
164
|
"Unable to intersect the requested extent: %s with the product "
|
|
169
165
|
"geometry: %s",
|
|
@@ -42,6 +42,7 @@ from shapely.ops import transform
|
|
|
42
42
|
from eodag.types.queryables import Queryables
|
|
43
43
|
from eodag.utils import (
|
|
44
44
|
DEFAULT_PROJ,
|
|
45
|
+
DEFAULT_SHAPELY_GEOMETRY,
|
|
45
46
|
_deprecated,
|
|
46
47
|
deepcopy,
|
|
47
48
|
dict_items_recursive_apply,
|
|
@@ -340,14 +341,16 @@ def format_metadata(search_param: str, *args: Any, **kwargs: Any) -> str:
|
|
|
340
341
|
@staticmethod
|
|
341
342
|
def convert_to_bounds(input_geom_unformatted: Any) -> list[float]:
|
|
342
343
|
input_geom = get_geometry_from_various(geometry=input_geom_unformatted)
|
|
344
|
+
if input_geom is None:
|
|
345
|
+
input_geom = DEFAULT_SHAPELY_GEOMETRY
|
|
343
346
|
if isinstance(input_geom, MultiPolygon):
|
|
344
347
|
geoms = [geom for geom in input_geom.geoms]
|
|
345
348
|
# sort with larger one at first (stac-browser only plots first one)
|
|
346
349
|
geoms.sort(key=lambda x: x.area, reverse=True)
|
|
347
|
-
min_lon = 180
|
|
348
|
-
min_lat = 90
|
|
349
|
-
max_lon = -180
|
|
350
|
-
max_lat = -90
|
|
350
|
+
min_lon = 180.0
|
|
351
|
+
min_lat = 90.0
|
|
352
|
+
max_lon = -180.0
|
|
353
|
+
max_lat = -90.0
|
|
351
354
|
for geom in geoms:
|
|
352
355
|
min_lon = min(min_lon, geom.bounds[0])
|
|
353
356
|
min_lat = min(min_lat, geom.bounds[1])
|
|
@@ -70,6 +70,7 @@ class FilterLatestIntersect(Crunch):
|
|
|
70
70
|
# Warning: May crash if startTimeFromAscendingNode is not in the appropriate format
|
|
71
71
|
products.sort(key=self.sort_product_by_start_date, reverse=True)
|
|
72
72
|
filtered: list[EOProduct] = []
|
|
73
|
+
search_extent: BaseGeometry
|
|
73
74
|
add_to_filtered = filtered.append
|
|
74
75
|
footprint: Union[dict[str, Any], BaseGeometry, Any] = search_params.get(
|
|
75
76
|
"geometry"
|
|
@@ -20,15 +20,11 @@ from __future__ import annotations
|
|
|
20
20
|
import logging
|
|
21
21
|
from typing import TYPE_CHECKING, Any
|
|
22
22
|
|
|
23
|
+
from shapely.errors import ShapelyError
|
|
24
|
+
|
|
23
25
|
from eodag.plugins.crunch.base import Crunch
|
|
24
26
|
from eodag.utils import get_geometry_from_various
|
|
25
27
|
|
|
26
|
-
try:
|
|
27
|
-
from shapely.errors import GEOSException
|
|
28
|
-
except ImportError:
|
|
29
|
-
# shapely < 2.0 compatibility
|
|
30
|
-
from shapely.errors import TopologicalError as GEOSException
|
|
31
|
-
|
|
32
28
|
if TYPE_CHECKING:
|
|
33
29
|
from eodag.api.product import EOProduct
|
|
34
30
|
|
|
@@ -108,7 +104,7 @@ class FilterOverlap(Crunch):
|
|
|
108
104
|
product_geometry = product.geometry.buffer(0)
|
|
109
105
|
try:
|
|
110
106
|
intersection = search_geom.intersection(product_geometry)
|
|
111
|
-
except
|
|
107
|
+
except ShapelyError:
|
|
112
108
|
logger.debug(
|
|
113
109
|
"Product geometry still invalid. Overlap test restricted to containment"
|
|
114
110
|
)
|
eodag/plugins/download/aws.py
CHANGED
|
@@ -716,7 +716,7 @@ class AwsDownload(Download):
|
|
|
716
716
|
ignore_assets,
|
|
717
717
|
product,
|
|
718
718
|
)
|
|
719
|
-
if auth and isinstance(auth, boto3.
|
|
719
|
+
if auth and isinstance(auth, boto3.resource("s3").__class__):
|
|
720
720
|
s3_resource = auth
|
|
721
721
|
else:
|
|
722
722
|
s3_resource = boto3.resource(
|
|
@@ -57,10 +57,16 @@ from eodag.utils import (
|
|
|
57
57
|
DEFAULT_SEARCH_TIMEOUT,
|
|
58
58
|
deepcopy,
|
|
59
59
|
dict_items_recursive_sort,
|
|
60
|
+
get_geometry_from_ecmwf_area,
|
|
61
|
+
get_geometry_from_ecmwf_feature,
|
|
60
62
|
get_geometry_from_various,
|
|
61
63
|
)
|
|
62
64
|
from eodag.utils.cache import instance_cached_method
|
|
63
|
-
from eodag.utils.dates import
|
|
65
|
+
from eodag.utils.dates import (
|
|
66
|
+
COMPACT_DATE_RANGE_PATTERN,
|
|
67
|
+
DATE_RANGE_PATTERN,
|
|
68
|
+
is_range_in_range,
|
|
69
|
+
)
|
|
64
70
|
from eodag.utils.exceptions import DownloadError, NotAvailableError, ValidationError
|
|
65
71
|
from eodag.utils.requests import fetch_json
|
|
66
72
|
|
|
@@ -145,6 +151,7 @@ COP_DS_KEYWORDS = {
|
|
|
145
151
|
"aerosol_type",
|
|
146
152
|
"altitude",
|
|
147
153
|
"product_type",
|
|
154
|
+
"area",
|
|
148
155
|
"band",
|
|
149
156
|
"cdr_type",
|
|
150
157
|
"data_format",
|
|
@@ -182,6 +189,7 @@ COP_DS_KEYWORDS = {
|
|
|
182
189
|
"region",
|
|
183
190
|
"release_version",
|
|
184
191
|
"satellite",
|
|
192
|
+
"satellite_mission",
|
|
185
193
|
"sensor",
|
|
186
194
|
"sensor_and_algorithm",
|
|
187
195
|
"soil_level",
|
|
@@ -189,6 +197,7 @@ COP_DS_KEYWORDS = {
|
|
|
189
197
|
"statistic",
|
|
190
198
|
"system_version",
|
|
191
199
|
"temporal_aggregation",
|
|
200
|
+
"temporal_resolution",
|
|
192
201
|
"time_aggregation",
|
|
193
202
|
"time_reference",
|
|
194
203
|
"time_step",
|
|
@@ -607,6 +616,14 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
607
616
|
# geometry
|
|
608
617
|
if "geometry" in params:
|
|
609
618
|
params["geometry"] = get_geometry_from_various(geometry=params["geometry"])
|
|
619
|
+
# ECMWF Polytope uses non-geojson structure for features
|
|
620
|
+
if "feature" in params:
|
|
621
|
+
params["geometry"] = get_geometry_from_ecmwf_feature(params["feature"])
|
|
622
|
+
params.pop("feature")
|
|
623
|
+
# bounding box in area format
|
|
624
|
+
if "area" in params:
|
|
625
|
+
params["geometry"] = get_geometry_from_ecmwf_area(params["area"])
|
|
626
|
+
params.pop("area")
|
|
610
627
|
|
|
611
628
|
return params
|
|
612
629
|
|
|
@@ -696,10 +713,13 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
696
713
|
if "end" in filters:
|
|
697
714
|
filters[END] = filters.pop("end")
|
|
698
715
|
|
|
699
|
-
# extract default datetime
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
716
|
+
# extract default datetime and convert geometry
|
|
717
|
+
try:
|
|
718
|
+
processed_filters = self._preprocess_search_params(
|
|
719
|
+
deepcopy(filters), product_type
|
|
720
|
+
)
|
|
721
|
+
except Exception as e:
|
|
722
|
+
raise ValidationError(e.args[0]) from e
|
|
703
723
|
|
|
704
724
|
constraints_url = format_metadata(
|
|
705
725
|
getattr(self.config, "discover_queryables", {}).get("constraints_url", ""),
|
|
@@ -714,7 +734,7 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
714
734
|
form: list[dict[str, Any]] = self._fetch_data(form_url)
|
|
715
735
|
|
|
716
736
|
formated_filters = self.format_as_provider_keyword(
|
|
717
|
-
product_type, processed_filters
|
|
737
|
+
product_type, deepcopy(processed_filters)
|
|
718
738
|
)
|
|
719
739
|
# we re-apply kwargs input to consider override of year, month, day and time.
|
|
720
740
|
for k, v in {**default_values, **kwargs}.items():
|
|
@@ -723,7 +743,6 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
723
743
|
if key not in ALLOWED_KEYWORDS | {
|
|
724
744
|
START,
|
|
725
745
|
END,
|
|
726
|
-
"geom",
|
|
727
746
|
"geometry",
|
|
728
747
|
}:
|
|
729
748
|
raise ValidationError(
|
|
@@ -772,7 +791,7 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
772
791
|
# To check if all keywords are queryable parameters, we check if they are in the
|
|
773
792
|
# available values or the product type config (available values calculated from the
|
|
774
793
|
# constraints might not include all queryables)
|
|
775
|
-
for keyword in
|
|
794
|
+
for keyword in processed_filters:
|
|
776
795
|
if (
|
|
777
796
|
keyword
|
|
778
797
|
not in available_values.keys()
|
|
@@ -780,7 +799,7 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
780
799
|
| {
|
|
781
800
|
START,
|
|
782
801
|
END,
|
|
783
|
-
"
|
|
802
|
+
"geometry",
|
|
784
803
|
}
|
|
785
804
|
and keyword not in [f["name"] for f in form]
|
|
786
805
|
and keyword.removeprefix(ECMWF_PREFIX)
|
|
@@ -880,13 +899,21 @@ class ECMWFSearch(PostJsonSearch):
|
|
|
880
899
|
)
|
|
881
900
|
|
|
882
901
|
# We convert every single value to a list of string
|
|
883
|
-
filter_v = values if isinstance(values,
|
|
902
|
+
filter_v = list(values) if isinstance(values, tuple) else values
|
|
903
|
+
filter_v = filter_v if isinstance(filter_v, list) else [filter_v]
|
|
884
904
|
|
|
885
905
|
# We strip values of superfluous quotes (added by mapping converter to_geojson).
|
|
886
|
-
# ECMWF accept
|
|
887
|
-
# ECMWF accept
|
|
888
|
-
|
|
889
|
-
|
|
906
|
+
# ECMWF accept date ranges with /to/. We need to split it to an array
|
|
907
|
+
# ECMWF accept date ranges in format val1/val2. We need to split it to an array
|
|
908
|
+
date_regex = [
|
|
909
|
+
re.compile(p) for p in (DATE_RANGE_PATTERN, COMPACT_DATE_RANGE_PATTERN)
|
|
910
|
+
]
|
|
911
|
+
is_date = any(
|
|
912
|
+
any(r.match(v) is not None for r in date_regex) for v in filter_v
|
|
913
|
+
)
|
|
914
|
+
if is_date:
|
|
915
|
+
sep = re.compile(r"/to/|/")
|
|
916
|
+
filter_v = [i for v in filter_v for i in sep.split(str(v))]
|
|
890
917
|
|
|
891
918
|
# special handling for time 0000 converted to 0 by pre-formating with metadata_mapping
|
|
892
919
|
if keyword.split(":")[-1] == "time":
|
|
@@ -211,9 +211,12 @@ class CopMarineSearch(StaticStacSearch):
|
|
|
211
211
|
dataset_item: dict[str, Any],
|
|
212
212
|
collection_dict: dict[str, Any],
|
|
213
213
|
use_dataset_dates: bool = False,
|
|
214
|
+
product_id: Optional[str] = None,
|
|
214
215
|
) -> Optional[EOProduct]:
|
|
215
216
|
|
|
216
217
|
item_id = os.path.splitext(item_key.split("/")[-1])[0]
|
|
218
|
+
if product_id and product_id != item_id:
|
|
219
|
+
return None
|
|
217
220
|
download_url = s3_url + "/" + item_key
|
|
218
221
|
geometry = (
|
|
219
222
|
get_geometry_from_various(**dataset_item)
|
|
@@ -377,9 +380,12 @@ class CopMarineSearch(StaticStacSearch):
|
|
|
377
380
|
dataset_item,
|
|
378
381
|
collection_dict,
|
|
379
382
|
True,
|
|
383
|
+
kwargs.get("id"),
|
|
380
384
|
)
|
|
381
385
|
if product:
|
|
382
386
|
products.append(product)
|
|
387
|
+
if product and kwargs.get("id"):
|
|
388
|
+
break
|
|
383
389
|
continue
|
|
384
390
|
|
|
385
391
|
s3_client = _get_s3_client(endpoint_url)
|
|
@@ -1552,19 +1552,16 @@ MFG_GSA_63:
|
|
|
1552
1552
|
|
|
1553
1553
|
HIRS_FDR_1_MULTI:
|
|
1554
1554
|
abstract: |
|
|
1555
|
-
This is Release
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
data. Some polygons of the HIRS data record are found to be incorrect.
|
|
1566
|
-
However, this does not affect the correctness of the data itself. This is a
|
|
1567
|
-
Fundamental Data Record (FDR).
|
|
1555
|
+
This is Release 2 of the Fundamental Data Record (FDR) brightness temperatures
|
|
1556
|
+
from the High Resolution Infrared Radiation Sounder (HIRS) on board NOAA and Metop
|
|
1557
|
+
satellites. The data record covers more than 40 years from 29 October 1978 to 31
|
|
1558
|
+
December 2022. Release 2 provides recalibrated Level 1c brightness temperatures
|
|
1559
|
+
based on the V4.0 calibration method developed by Cao et al. (2007). This method
|
|
1560
|
+
was implemented into the NWP-SAF software ATOVS and AVHRR processing Package (AAPP).
|
|
1561
|
+
This software was consistently used to recalibrate and reprocess data from all HIRS
|
|
1562
|
+
instruments on board TIROS-N, NOAA-06 to NOAA-19, Metop-A, and Metop-B. Input HIRS
|
|
1563
|
+
data were collected from NOAA/CLASS and ECMWF archives and merged to produce a
|
|
1564
|
+
longer time series of some of the satellites.
|
|
1568
1565
|
instrument: HIRS
|
|
1569
1566
|
platform: Metop,TIROS,NOAA
|
|
1570
1567
|
platformSerialIdentifier: Metop,TIROS,NOAA
|
|
@@ -1572,7 +1569,7 @@ HIRS_FDR_1_MULTI:
|
|
|
1572
1569
|
keywords: HIRS,L1C,HIRS,TIROS,Metop,NOAA,Sounder,FDR
|
|
1573
1570
|
sensorType: Sounder
|
|
1574
1571
|
license: other
|
|
1575
|
-
title: HIRS Level 1C Fundamental Data Record Release
|
|
1572
|
+
title: HIRS Level 1C Fundamental Data Record Release 2 - Multimission - Global
|
|
1576
1573
|
missionStartDate: "1978-10-29T00:00:00Z"
|
|
1577
1574
|
missionEndDate: "2020-12-31T23:59:59Z"
|
|
1578
1575
|
|
|
@@ -4687,28 +4684,6 @@ EEA_DAILY_SSM_1KM:
|
|
|
4687
4684
|
title: "Surface Soil Moisture: continental Europe daily (raster 1km) - version 1, Apr 2019"
|
|
4688
4685
|
missionStartDate: "2015-01-01T00:00:00Z"
|
|
4689
4686
|
|
|
4690
|
-
EEA_DAILY_VI:
|
|
4691
|
-
abstract: |
|
|
4692
|
-
Vegetation Indices (VI) comprises four daily vegetation indices (PPI, NDVI, LAI and FAPAR) and quality information,
|
|
4693
|
-
that are part of the Copernicus Land Monitoring Service (CLMS) HR-VPP product suite. The 10m resolution, daily updated
|
|
4694
|
-
Plant Phenology Index (PPI), Normalized Difference Vegetation Index (NDVI), Leaf Area Index (LAI) and Fraction of Absorbed
|
|
4695
|
-
Photosynthetically Active Radiation (fAPAR) are derived from Copernicus Sentinel-2 satellite observations. They are
|
|
4696
|
-
provided together with a related quality indicator (QFLAG2) that flags clouds, shadows, snow, open water and other areas
|
|
4697
|
-
where the VI retrieval is less reliable. These Vegetation Indices are made available as a set of raster files with 10 x 10m
|
|
4698
|
-
resolution, in UTM/WGS84 projection corresponding to the Sentinel-2 tiling grid, for those tiles that cover the EEA38
|
|
4699
|
-
countries and the United Kingdom and for the period from 2017 until today, with daily updates. The Vegetation Indices
|
|
4700
|
-
are part of the pan-European High Resolution Vegetation Phenology and Productivity (HR-VPP) component of the Copernicus
|
|
4701
|
-
Land Monitoring Service (CLMS).
|
|
4702
|
-
instrument:
|
|
4703
|
-
platform: Sentinel-2
|
|
4704
|
-
platformSerialIdentifier: S2A,S2B,S2C
|
|
4705
|
-
processingLevel:
|
|
4706
|
-
keywords: Land,Plant-phenology-index,Phenology,Vegetation,Sentinel-2,S2A,S2B,S2C
|
|
4707
|
-
sensorType: RADAR
|
|
4708
|
-
license: other
|
|
4709
|
-
title: Vegetation Indices, daily, UTM projection
|
|
4710
|
-
missionStartDate:
|
|
4711
|
-
|
|
4712
4687
|
EEA_HRL_TCF:
|
|
4713
4688
|
abstract: |
|
|
4714
4689
|
Tree Cover Fraction (TCF) is defined as the percentage of ground covered by tree canopy when viewed from above.
|
|
@@ -4726,6 +4701,76 @@ EEA_HRL_TCF:
|
|
|
4726
4701
|
title: Tree Cover Fraction, UTM projection
|
|
4727
4702
|
missionStartDate: "2017-01-01T00:00:00Z"
|
|
4728
4703
|
|
|
4704
|
+
CLMS_HRVPP_ST:
|
|
4705
|
+
abstract: |
|
|
4706
|
+
The Seasonal Trajectories product is a filtered time series of Plant Phenology Index (PPI), with regular time step, part of the Copernicus Land Monitoring Service (CLMS) HR-VPP product suite.
|
|
4707
|
+
Plant Phenology Index (PPI) is a physically based vegetation index that is optimized for monitoring vegetation phenology and has a linear relationship with green leaf area index.
|
|
4708
|
+
The Seasonal Trajectories (ST) products are derived from a function fitting of the time series of the PPI vegetation index and hence provide a filtered PPI time series, with regular 10-day time step, together with related quality information (QFLAG).
|
|
4709
|
+
The PPI Seasonal Trajectories are derived from the PPI vegetation index and hence based on Copernicus Sentinel-2 satellite observations.
|
|
4710
|
+
The ST products are made available as a set of raster files with 10m and 100m resolution, in ETRS89/LAEA projection corresponding to the High Resolution Layers tiling grid, for those tiles that cover the EEA38 countries and the United Kingdom, and for the period from 2017 until today, with yearly updates.
|
|
4711
|
+
These Seasonal Trajectories are part of the pan-European High Resolution Vegetation Phenology and Productivity (HR-VPP) component of the Copernicus Land Monitoring Service (CLMS).
|
|
4712
|
+
instrument:
|
|
4713
|
+
platform: Sentinel-2
|
|
4714
|
+
platformSerialIdentifier: S2A,S2B,S2C
|
|
4715
|
+
processingLevel:
|
|
4716
|
+
keywords: Land,Plant-phenology-index,Phenology,Vegetation,Sentinel-2,S2A,S2B,S2C
|
|
4717
|
+
sensorType:
|
|
4718
|
+
license: other
|
|
4719
|
+
title: Seasonal Trajectories, 10-daily, ST projection
|
|
4720
|
+
missionStartDate:
|
|
4721
|
+
|
|
4722
|
+
CLMS_HRVPP_ST_LAEA:
|
|
4723
|
+
abstract: |
|
|
4724
|
+
The Seasonal Trajectories product is a filtered time series of Plant Phenology Index (PPI), with regular time step, part of the Copernicus Land Monitoring Service (CLMS) HR-VPP product suite.
|
|
4725
|
+
Plant Phenology Index (PPI) is a physically based vegetation index that is optimized for monitoring vegetation phenology and has a linear relationship with green leaf area index.
|
|
4726
|
+
The Seasonal Trajectories (ST) products are derived from a function fitting of the time series of the PPI vegetation index and hence provide a filtered PPI time series, with regular 10-day time step, together with related quality information (QFLAG).
|
|
4727
|
+
The PPI Seasonal Trajectories are derived from the PPI vegetation index and hence based on Copernicus Sentinel-2 satellite observations.
|
|
4728
|
+
The ST products are made available as a set of raster files with 10m and 100m resolution, in ETRS89/LAEA projection corresponding to the High Resolution Layers tiling grid, for those tiles that cover the EEA38 countries and the United Kingdom, and for the period from 2017 until today, with yearly updates.
|
|
4729
|
+
These Seasonal Trajectories are part of the pan-European High Resolution Vegetation Phenology and Productivity (HR-VPP) component of the Copernicus Land Monitoring Service (CLMS).
|
|
4730
|
+
instrument:
|
|
4731
|
+
platform: Sentinel-2
|
|
4732
|
+
platformSerialIdentifier: S2A,S2B,S2C
|
|
4733
|
+
processingLevel:
|
|
4734
|
+
keywords: Land,Plant-phenology-index,Phenology,Vegetation,Sentinel-2,S2A,S2B,S2C
|
|
4735
|
+
sensorType:
|
|
4736
|
+
license: other
|
|
4737
|
+
title: Seasonal Trajectories, 10-daily, LAEA projection
|
|
4738
|
+
missionStartDate:
|
|
4739
|
+
|
|
4740
|
+
CLMS_HRVPP_VPP:
|
|
4741
|
+
abstract: |
|
|
4742
|
+
Vegetation Phenology and Productivity (VPP) comprise 13 parameters up to 2 seasons that characterize the vegetation growth cycle. It is part of the Copernicus Land Monitoring Service (CLMS) HR-VPP product suite.
|
|
4743
|
+
A set of 13 Vegetation Phenology and Productivity parameters are derived, for up to two growing seasons. These parameters include the start, end and length of the growing season, the dates when the vegetation index reaches its minimum and maximum values, the maximum value itself and its distance to the minimum (amplitude), the slopes of the green-up and green-down periods and the seasonal and total productivity.
|
|
4744
|
+
The Vegetation and Productivity parameters are extracted from the filtered PPI time-series, the HR-VPP Seasonal Trajectories, and hence based on Copernicus Sentinel-2 satellite observations.
|
|
4745
|
+
The VPP parameters are made available as a set of raster files with 10m and 100m resolution, in ETRS89/LAEA projection corresponding to the High Resolution Layers tiling grid, for those tiles that cover the EEA38 countries and the United Kingdom and for the period from 2017 until today, with yearly updates.
|
|
4746
|
+
This VPP product is part of the pan-European High Resolution Vegetation Phenology and Productivity (HR-VPP) component of the Copernicus Land Monitoring Service (CLMS).
|
|
4747
|
+
instrument:
|
|
4748
|
+
platform: Sentinel-2
|
|
4749
|
+
platformSerialIdentifier: S2A,S2B,S2C
|
|
4750
|
+
processingLevel:
|
|
4751
|
+
keywords: Land,Plant-phenology-index,Phenology,Vegetation,Sentinel-2,S2A,S2B,S2C
|
|
4752
|
+
sensorType:
|
|
4753
|
+
license: other
|
|
4754
|
+
title: Vegetation Phenology and Productivity, yearly, UTM projection
|
|
4755
|
+
missionStartDate:
|
|
4756
|
+
|
|
4757
|
+
CLMS_HRVPP_VPP_LAEA:
|
|
4758
|
+
abstract: |
|
|
4759
|
+
Vegetation Phenology and Productivity (VPP) comprise 13 parameters up to 2 seasons that characterize the vegetation growth cycle. It is part of the Copernicus Land Monitoring Service (CLMS) HR-VPP product suite.
|
|
4760
|
+
A set of 13 Vegetation Phenology and Productivity parameters are derived, for up to two growing seasons. These parameters include the start, end and length of the growing season, the dates when the vegetation index reaches its minimum and maximum values, the maximum value itself and its distance to the minimum (amplitude), the slopes of the green-up and green-down periods and the seasonal and total productivity.
|
|
4761
|
+
The Vegetation and Productivity parameters are extracted from the filtered PPI time-series, the HR-VPP Seasonal Trajectories, and hence based on Copernicus Sentinel-2 satellite observations.
|
|
4762
|
+
The VPP parameters are made available as a set of raster files with 10m and 100m resolution, in ETRS89/LAEA projection corresponding to the High Resolution Layers tiling grid, for those tiles that cover the EEA38 countries and the United Kingdom and for the period from 2017 until today, with yearly updates.
|
|
4763
|
+
This VPP product is part of the pan-European High Resolution Vegetation Phenology and Productivity (HR-VPP) component of the Copernicus Land Monitoring Service (CLMS).
|
|
4764
|
+
instrument:
|
|
4765
|
+
platform: Sentinel-2
|
|
4766
|
+
platformSerialIdentifier: S2A,S2B,S2C
|
|
4767
|
+
processingLevel:
|
|
4768
|
+
keywords: Land,Plant-phenology-index,Phenology,Vegetation,Sentinel-2,S2A,S2B,S2C
|
|
4769
|
+
sensorType:
|
|
4770
|
+
license: other
|
|
4771
|
+
title: Vegetation Phenology and Productivity, yearly, LAEA projection
|
|
4772
|
+
missionStartDate:
|
|
4773
|
+
|
|
4729
4774
|
# MARK: AERIS --------------------------------------------------------------------------
|
|
4730
4775
|
AERIS_IAGOS:
|
|
4731
4776
|
abstract: |
|
eodag/resources/providers.yml
CHANGED
|
@@ -3433,25 +3433,6 @@
|
|
|
3433
3433
|
productType: EO:ESA:DAT:SENTINEL-5P
|
|
3434
3434
|
processingLevel: L2
|
|
3435
3435
|
metadata_mapping_from_product: S5P_L1B_IR_ALL
|
|
3436
|
-
EEA_DAILY_VI:
|
|
3437
|
-
productType: EO:EEA:DAT:CLMS_HRVPP_VI
|
|
3438
|
-
metadata_mapping:
|
|
3439
|
-
id:
|
|
3440
|
-
- '{{"uid": "{id}"}}'
|
|
3441
|
-
- '$.id'
|
|
3442
|
-
relativeOrbitNumber:
|
|
3443
|
-
- '{{"relativeOrbitNumber": "{relativeOrbitNumber}"}}'
|
|
3444
|
-
- '$.null'
|
|
3445
|
-
version:
|
|
3446
|
-
- '{{"productVersion": "{version}"}}'
|
|
3447
|
-
- '$.null'
|
|
3448
|
-
platformSerialIdentifier:
|
|
3449
|
-
- '{{"platformSerialIdentifier": "{platformSerialIdentifier}"}}'
|
|
3450
|
-
- '$.id.`sub(/^[^_]+_[^_]+_([^_]+)_.*/, \\1)`'
|
|
3451
|
-
tileIdentifier:
|
|
3452
|
-
- '{{"tileId": "{tileIdentifier}"}}'
|
|
3453
|
-
- '$.null'
|
|
3454
|
-
orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:EEA:DAT:CLMS_HRVPP_VI"}}'
|
|
3455
3436
|
EEA_HRL_TCF:
|
|
3456
3437
|
productType: EO:EEA:DAT:HRL:TCF
|
|
3457
3438
|
metadata_mapping:
|
|
@@ -3541,6 +3522,34 @@
|
|
|
3541
3522
|
metadata_mapping_from_product: CLMS_GLO_FCOVER_333M
|
|
3542
3523
|
metadata_mapping:
|
|
3543
3524
|
orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:CLMS:DAT:CLMS_GLOBAL_LAI_300M_V1_10DAILY_NETCDF"}}'
|
|
3525
|
+
CLMS_HRVPP_ST:
|
|
3526
|
+
_collection: EO:EEA:DAT:CLMS_HRVPP_ST
|
|
3527
|
+
metadata_mapping:
|
|
3528
|
+
id:
|
|
3529
|
+
- '{{"uid": "{id}"}}'
|
|
3530
|
+
- '$.id'
|
|
3531
|
+
orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:EEA:DAT:CLMS_HRVPP_ST"}}'
|
|
3532
|
+
CLMS_HRVPP_ST_LAEA:
|
|
3533
|
+
_collection: EO:EEA:DAT:CLMS_HRVPP_ST-LAEA
|
|
3534
|
+
metadata_mapping:
|
|
3535
|
+
id:
|
|
3536
|
+
- '{{"uid": "{id}"}}'
|
|
3537
|
+
- '$.id'
|
|
3538
|
+
orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:EEA:DAT:CLMS_HRVPP_ST-LAEA"}}'
|
|
3539
|
+
CLMS_HRVPP_VPP:
|
|
3540
|
+
_collection: EO:EEA:DAT:CLMS_HRVPP_VPP
|
|
3541
|
+
metadata_mapping:
|
|
3542
|
+
id:
|
|
3543
|
+
- '{{"uid": "{id}"}}'
|
|
3544
|
+
- '$.id'
|
|
3545
|
+
orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:EEA:DAT:CLMS_HRVPP_VPP"}}'
|
|
3546
|
+
CLMS_HRVPP_VPP_LAEA:
|
|
3547
|
+
_collection: EO:EEA:DAT:CLMS_HRVPP_VPP-LAEA
|
|
3548
|
+
metadata_mapping:
|
|
3549
|
+
id:
|
|
3550
|
+
- '{{"uid": "{id}"}}'
|
|
3551
|
+
- '$.id'
|
|
3552
|
+
orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:EEA:DAT:CLMS_HRVPP_VPP-LAEA"}}'
|
|
3544
3553
|
auth: !plugin
|
|
3545
3554
|
type: TokenAuth
|
|
3546
3555
|
matching_url: https://[-\w\.]+.wekeo2.eu
|
|
@@ -5221,8 +5230,6 @@
|
|
|
5221
5230
|
productType: EO.CLMS.DAT.GLO.NDVI_1KM_V2
|
|
5222
5231
|
CLMS_GLO_NDVI_333M:
|
|
5223
5232
|
productType: EO.CLMS.DAT.GLO.NDVI300_V1
|
|
5224
|
-
EEA_DAILY_VI:
|
|
5225
|
-
productType: EO.CLMS.DAT.SENTINEL-2.HRVPP.VI
|
|
5226
5233
|
# Landsat data
|
|
5227
5234
|
LANDSAT_C2L1:
|
|
5228
5235
|
productType: EO.NASA.DAT.LANDSAT.C2_L1
|
|
@@ -5758,7 +5765,7 @@
|
|
|
5758
5765
|
MSG_CTH_IODC:
|
|
5759
5766
|
parentIdentifier: EO:EUM:DAT:MSG:CTH-IODC
|
|
5760
5767
|
HIRS_FDR_1_MULTI:
|
|
5761
|
-
parentIdentifier: EO:EUM:DAT:
|
|
5768
|
+
parentIdentifier: EO:EUM:DAT:0961
|
|
5762
5769
|
MSG_OCA_CDR:
|
|
5763
5770
|
parentIdentifier: EO:EUM:DAT:0617
|
|
5764
5771
|
S6_RADIO_OCCULTATION:
|
|
@@ -6008,8 +6015,8 @@
|
|
|
6008
6015
|
limit: 10000
|
|
6009
6016
|
pagination:
|
|
6010
6017
|
total_items_nb_key_path: '$.context.matched'
|
|
6011
|
-
#
|
|
6012
|
-
max_items_per_page:
|
|
6018
|
+
# As of 2025/11/21 the geodes API documentation (https://geodes.cnes.fr/support/api/) states that pagination must be limited to 80.
|
|
6019
|
+
max_items_per_page: 80
|
|
6013
6020
|
sort:
|
|
6014
6021
|
sort_by_tpl: '{{"sortBy": [ {{"field": "{sort_param}", "direction": "{sort_order}" }} ] }}'
|
|
6015
6022
|
sort_by_default:
|
|
@@ -6089,11 +6096,11 @@
|
|
|
6089
6096
|
S2_MSI_L1C:
|
|
6090
6097
|
productType: PEPS_S2_L1C
|
|
6091
6098
|
S2_MSI_L2A_MAJA:
|
|
6092
|
-
productType:
|
|
6099
|
+
productType: THEIA_REFLECTANCE_SENTINEL2_L2A
|
|
6093
6100
|
S2_MSI_L2B_MAJA_SNOW:
|
|
6094
|
-
productType:
|
|
6101
|
+
productType: THEIA_SNOW_SENTINEL2_L2B
|
|
6095
6102
|
S2_MSI_L2B_MAJA_WATER:
|
|
6096
|
-
productType:
|
|
6103
|
+
productType: THEIA_WATERQUAL_SENTINEL2_L2B
|
|
6097
6104
|
GENERIC_PRODUCT_TYPE:
|
|
6098
6105
|
productType: '{productType}'
|
|
6099
6106
|
download: !plugin
|
|
@@ -6133,8 +6140,8 @@
|
|
|
6133
6140
|
limit: 10000
|
|
6134
6141
|
pagination:
|
|
6135
6142
|
total_items_nb_key_path: '$.context.matched'
|
|
6136
|
-
#
|
|
6137
|
-
max_items_per_page:
|
|
6143
|
+
# As of 2025/11/21 the geodes API documentation (https://geodes.cnes.fr/support/api/) states that pagination must be limited to 80.
|
|
6144
|
+
max_items_per_page: 80
|
|
6138
6145
|
sort:
|
|
6139
6146
|
sort_by_tpl: '{{"sortBy": [ {{"field": "{sort_param}", "direction": "{sort_order}" }} ] }}'
|
|
6140
6147
|
sort_by_default:
|
|
@@ -6214,11 +6221,11 @@
|
|
|
6214
6221
|
S2_MSI_L1C:
|
|
6215
6222
|
productType: PEPS_S2_L1C
|
|
6216
6223
|
S2_MSI_L2A_MAJA:
|
|
6217
|
-
productType:
|
|
6224
|
+
productType: THEIA_REFLECTANCE_SENTINEL2_L2A
|
|
6218
6225
|
S2_MSI_L2B_MAJA_SNOW:
|
|
6219
|
-
productType:
|
|
6226
|
+
productType: THEIA_SNOW_SENTINEL2_L2B
|
|
6220
6227
|
S2_MSI_L2B_MAJA_WATER:
|
|
6221
|
-
productType:
|
|
6228
|
+
productType: THEIA_WATERQUAL_SENTINEL2_L2B
|
|
6222
6229
|
GENERIC_PRODUCT_TYPE:
|
|
6223
6230
|
productType: '{productType}'
|
|
6224
6231
|
download: !plugin
|
eodag/types/queryables.py
CHANGED
eodag/utils/__init__.py
CHANGED
|
@@ -77,7 +77,7 @@ from jsonpath_ng import jsonpath
|
|
|
77
77
|
from jsonpath_ng.ext import parse
|
|
78
78
|
from jsonpath_ng.jsonpath import Child, Fields, Index, Root, Slice
|
|
79
79
|
from requests import HTTPError, Response
|
|
80
|
-
from shapely.geometry import Polygon, shape
|
|
80
|
+
from shapely.geometry import Polygon, box, shape
|
|
81
81
|
from shapely.geometry.base import GEOMETRY_TYPES, BaseGeometry
|
|
82
82
|
from tqdm.auto import tqdm
|
|
83
83
|
|
|
@@ -132,6 +132,9 @@ DEFAULT_MAX_ITEMS_PER_PAGE = 50
|
|
|
132
132
|
# default product-types start date
|
|
133
133
|
DEFAULT_MISSION_START_DATE = "2015-01-01T00:00:00.000Z"
|
|
134
134
|
|
|
135
|
+
# default geometry / whole world bounding box
|
|
136
|
+
DEFAULT_SHAPELY_GEOMETRY = box(-180, -90, 180, 90)
|
|
137
|
+
|
|
135
138
|
# default token expiration margin in seconds
|
|
136
139
|
DEFAULT_TOKEN_EXPIRATION_MARGIN = 60
|
|
137
140
|
|
|
@@ -1052,7 +1055,7 @@ def nested_pairs2dict(pairs: Union[list[Any], Any]) -> Union[Any, dict[Any, Any]
|
|
|
1052
1055
|
|
|
1053
1056
|
def get_geometry_from_various(
|
|
1054
1057
|
locations_config: list[dict[str, Any]] = [], **query_args: Any
|
|
1055
|
-
) -> BaseGeometry:
|
|
1058
|
+
) -> Optional[BaseGeometry]:
|
|
1056
1059
|
"""Creates a ``shapely.geometry`` using given query kwargs arguments
|
|
1057
1060
|
|
|
1058
1061
|
:param locations_config: (optional) EODAG locations configuration
|
|
@@ -1137,6 +1140,45 @@ def get_geometry_from_various(
|
|
|
1137
1140
|
return geom
|
|
1138
1141
|
|
|
1139
1142
|
|
|
1143
|
+
def get_geometry_from_ecmwf_feature(geom: dict[str, Any]) -> BaseGeometry:
|
|
1144
|
+
"""
|
|
1145
|
+
Creates a ``shapely.geometry`` from ECMWF Polytope shape.
|
|
1146
|
+
|
|
1147
|
+
:param geom: ECMWF Polytope shape.
|
|
1148
|
+
:returns: A Shapely polygon.
|
|
1149
|
+
"""
|
|
1150
|
+
if not isinstance(geom, dict):
|
|
1151
|
+
raise TypeError(
|
|
1152
|
+
"Geometry must be a dictionary, instead it's {}".format(type(geom))
|
|
1153
|
+
)
|
|
1154
|
+
if "type" not in geom or geom["type"] != "polygon":
|
|
1155
|
+
raise TypeError("Geometry type must be 'polygon'")
|
|
1156
|
+
if "shape" not in geom:
|
|
1157
|
+
raise TypeError("Missing shape in the geometry")
|
|
1158
|
+
if not isinstance(geom["shape"], list):
|
|
1159
|
+
raise TypeError("Geometry shape must be a list")
|
|
1160
|
+
|
|
1161
|
+
shape: list = geom["shape"]
|
|
1162
|
+
polygon_args = [(p[1], p[0]) for p in shape]
|
|
1163
|
+
return Polygon(polygon_args)
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
def get_geometry_from_ecmwf_area(area: list[float]) -> Optional[BaseGeometry]:
|
|
1167
|
+
"""
|
|
1168
|
+
Creates a ``shapely.geometry`` from bounding box in area format.
|
|
1169
|
+
|
|
1170
|
+
area format: [max_lat,min_lon,min_lat,max_lon]
|
|
1171
|
+
|
|
1172
|
+
:param area: bounding box in area format.
|
|
1173
|
+
:returns: A Shapely polygon.
|
|
1174
|
+
"""
|
|
1175
|
+
if len(area) != 4:
|
|
1176
|
+
raise ValueError("The area must be a list of 4 values")
|
|
1177
|
+
max_lat, min_lon, min_lat, max_lon = area
|
|
1178
|
+
bbox = [min_lon, min_lat, max_lon, max_lat]
|
|
1179
|
+
return get_geometry_from_various(geometry=bbox)
|
|
1180
|
+
|
|
1181
|
+
|
|
1140
1182
|
class MockResponse:
|
|
1141
1183
|
"""Fake requests response"""
|
|
1142
1184
|
|
eodag/utils/dates.py
CHANGED
|
@@ -35,6 +35,18 @@ RFC3339_PATTERN = (
|
|
|
35
35
|
r"(Z|([+-])(\d{2}):(\d{2}))?)?$"
|
|
36
36
|
)
|
|
37
37
|
|
|
38
|
+
# yyyy-mm-dd
|
|
39
|
+
DATE_PATTERN = r"\d{4}-(0[1-9]|1[1,2])-(0[1-9]|[12][0-9]|3[01])"
|
|
40
|
+
|
|
41
|
+
# yyyymmdd
|
|
42
|
+
COMPACT_DATE_PATTERN = r"\d{4}(0[1-9]|1[1,2])(0[1-9]|[12][0-9]|3[01])"
|
|
43
|
+
|
|
44
|
+
# yyyy-mm-dd/yyyy-mm-dd, yyyy-mm-dd/to/yyyy-mm-dd
|
|
45
|
+
DATE_RANGE_PATTERN = DATE_PATTERN + r"(/to/|/)" + DATE_PATTERN
|
|
46
|
+
|
|
47
|
+
# yyyymmdd/yyyymmdd, yyyymmdd/to/yyyymmdd
|
|
48
|
+
COMPACT_DATE_RANGE_PATTERN = COMPACT_DATE_PATTERN + r"(/to/|/)" + COMPACT_DATE_PATTERN
|
|
49
|
+
|
|
38
50
|
|
|
39
51
|
def get_timestamp(date_time: str) -> float:
|
|
40
52
|
"""Return the Unix timestamp of an ISO8601 date/datetime in seconds.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eodag
|
|
3
|
-
Version: 3.10.
|
|
3
|
+
Version: 3.10.1
|
|
4
4
|
Summary: Earth Observation Data Access Gateway
|
|
5
5
|
Home-page: https://github.com/CS-SI/eodag
|
|
6
6
|
Author: CS GROUP - France
|
|
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.11
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.12
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
26
27
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
27
28
|
Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
|
|
28
29
|
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
@@ -40,7 +41,7 @@ Requires-Dist: importlib_metadata>=5.0
|
|
|
40
41
|
Requires-Dist: jsonpath-ng
|
|
41
42
|
Requires-Dist: lxml
|
|
42
43
|
Requires-Dist: orjson
|
|
43
|
-
Requires-Dist: pydantic!=2.10.0
|
|
44
|
+
Requires-Dist: pydantic!=2.10.0,>=2.1.0
|
|
44
45
|
Requires-Dist: pydantic_core
|
|
45
46
|
Requires-Dist: PyJWT[crypto]>=2.5.0
|
|
46
47
|
Requires-Dist: pyproj>=2.1.0
|
|
@@ -115,6 +116,7 @@ Requires-Dist: types-requests; extra == "stubs"
|
|
|
115
116
|
Requires-Dist: types-python-dateutil; extra == "stubs"
|
|
116
117
|
Requires-Dist: types-PyYAML; extra == "stubs"
|
|
117
118
|
Requires-Dist: types-setuptools; extra == "stubs"
|
|
119
|
+
Requires-Dist: types-shapely; extra == "stubs"
|
|
118
120
|
Requires-Dist: types-tqdm; extra == "stubs"
|
|
119
121
|
Requires-Dist: types-urllib3; extra == "stubs"
|
|
120
122
|
Provides-Extra: docs
|
|
@@ -317,7 +319,7 @@ An eodag instance can be exposed through a STAC compliant REST api from the comm
|
|
|
317
319
|
|
|
318
320
|
.. code-block:: bash
|
|
319
321
|
|
|
320
|
-
docker run -p 5000:5000 --rm csspace/eodag-server:3.10.
|
|
322
|
+
docker run -p 5000:5000 --rm csspace/eodag-server:3.10.1
|
|
321
323
|
|
|
322
324
|
You can also browse over your STAC API server using `STAC Browser <https://github.com/radiantearth/stac-browser>`_.
|
|
323
325
|
Simply run:
|
|
@@ -377,6 +379,15 @@ Start playing with the CLI:
|
|
|
377
379
|
|
|
378
380
|
- To print log messages, add ``-v`` to eodag master command. e.g. ``eodag -v list``. The more ``v`` given (up to 3), the more verbose the tool is. For a full verbose output, do for example: ``eodag -vvv list``
|
|
379
381
|
|
|
382
|
+
Docker image
|
|
383
|
+
------------
|
|
384
|
+
|
|
385
|
+
A Docker image is available via the `GitHub Container Registry <https://github.com/CS-SI/eodag/pkgs/container/eodag>`_:
|
|
386
|
+
|
|
387
|
+
.. code-block:: bash
|
|
388
|
+
|
|
389
|
+
docker pull ghcr.io/cs-si/eodag:v3.10.x
|
|
390
|
+
|
|
380
391
|
Contribute
|
|
381
392
|
==========
|
|
382
393
|
|
|
@@ -4,12 +4,12 @@ eodag/config.py,sha256=-Ub-sAdJRhTQTrK23AZcYANtoZp-xQdB0M_FZorRLVg,48557
|
|
|
4
4
|
eodag/crunch.py,sha256=fLVAPGVPw31N_DrnFk4gkCpQZLMY8oBhK6NUSYmdr24,1099
|
|
5
5
|
eodag/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
eodag/api/__init__.py,sha256=ytr30NUVmEtmJTsp3QCwkCIhS1nF6UlFCv0vmySHN7g,735
|
|
7
|
-
eodag/api/core.py,sha256=
|
|
7
|
+
eodag/api/core.py,sha256=JHsK8p481Ak7SCYByqodGUqznF6y9Qks6NaLcFvK8UI,109445
|
|
8
8
|
eodag/api/search_result.py,sha256=2Y2W3xDUyainwcyYBQljGRi6oyOqTTspgCgIlNG4kCc,14383
|
|
9
9
|
eodag/api/product/__init__.py,sha256=k5iNHxXX6wDLsUo725W4U_Jz8CVbZTbfE8R9s1YQwKA,2508
|
|
10
10
|
eodag/api/product/_assets.py,sha256=9bWIe_SYvsQO-q_lQFd7SxhUIWv7feze2-wnXOe8hhs,7570
|
|
11
|
-
eodag/api/product/_product.py,sha256=
|
|
12
|
-
eodag/api/product/metadata_mapping.py,sha256=
|
|
11
|
+
eodag/api/product/_product.py,sha256=JbBxl_J5kJH_8RK3H-lLOoPE9ajry8vc7uvKH20YK24,26708
|
|
12
|
+
eodag/api/product/metadata_mapping.py,sha256=FiRhb23hO1g00Jj7ck4VUnhWafcZ9r3Hy1i05kGuOAg,79313
|
|
13
13
|
eodag/api/product/drivers/__init__.py,sha256=Sy9bGmDhWCAxvxRUf3QGijjQoQvzS1LSUMN34Usq6fM,3357
|
|
14
14
|
eodag/api/product/drivers/base.py,sha256=iPAE5Jx3isxmHHFPP-jysdUylYbsbIq6UejU3qsMROE,4111
|
|
15
15
|
eodag/api/product/drivers/generic.py,sha256=obwH8paf2TP7afnjfx4GxSZPSrTs3suTYJWQvebmigY,2207
|
|
@@ -37,20 +37,20 @@ eodag/plugins/authentication/token_exchange.py,sha256=raFIN8UnO9MpqQukDJg4Pog-LJ
|
|
|
37
37
|
eodag/plugins/crunch/__init__.py,sha256=58D7kJhEpHJWobIKaNFPynfbSqAWgS90BiHzitqS5Ds,746
|
|
38
38
|
eodag/plugins/crunch/base.py,sha256=XW4HISgR0UswiEZmE4t42HxnSxknZBtVpuK8XVLYHzU,1415
|
|
39
39
|
eodag/plugins/crunch/filter_date.py,sha256=dTpUg43KkGU81K2-BO7pL0VbbQbZiwweE2RRWKtXpyw,4356
|
|
40
|
-
eodag/plugins/crunch/filter_latest_intersect.py,sha256=
|
|
40
|
+
eodag/plugins/crunch/filter_latest_intersect.py,sha256=Yeu1AtKsSW4O8HX2tP4IOttn0DrKJe5HWb5-8lrmFjI,4462
|
|
41
41
|
eodag/plugins/crunch/filter_latest_tpl_name.py,sha256=pP4EDP73mQg1zvkVm1Uo4nGAgwhNsMWe7_ecOBDbA0E,3679
|
|
42
|
-
eodag/plugins/crunch/filter_overlap.py,sha256=
|
|
42
|
+
eodag/plugins/crunch/filter_overlap.py,sha256=tU3h15jyfePOQPgGvowHFm2ZuckEbAo6lgLQNaPiJ2Q,7142
|
|
43
43
|
eodag/plugins/crunch/filter_property.py,sha256=2BKb7wxw1Yi2NTtnPCBtdZ-caJXxlVUUS2ps4LHXOMI,3187
|
|
44
44
|
eodag/plugins/download/__init__.py,sha256=zqszaeNgYP0YHlZDkLMf6odcwNw0KrAahGpcA-l0kAw,740
|
|
45
|
-
eodag/plugins/download/aws.py,sha256=
|
|
45
|
+
eodag/plugins/download/aws.py,sha256=Zapv1l5V-g9qxFU59HT-kPmypKEBvHqiaar3_Oyzu7s,46707
|
|
46
46
|
eodag/plugins/download/base.py,sha256=ub217oE_IarzfrSk8DFN6Sfj9aE3VcCENjVGt9xjzKA,30899
|
|
47
47
|
eodag/plugins/download/creodias_s3.py,sha256=iSS2iqyvzW_SaxYvq2SeFshzHQKv94-NOgqLJsiyL-4,2998
|
|
48
48
|
eodag/plugins/download/http.py,sha256=b5od-j28B0dYxIXoOSNz1OmVgPVqLPD-eO9vfrrUorM,58532
|
|
49
49
|
eodag/plugins/download/s3rest.py,sha256=9gNoCf9UPr8XffuPrZeyf2B67IXoibmOIhSeiH1PIOA,15215
|
|
50
50
|
eodag/plugins/search/__init__.py,sha256=dShNJxU5NzF27aW-PgYtpyKimCibTlgf38PFsf_Rqa8,2086
|
|
51
51
|
eodag/plugins/search/base.py,sha256=LBS7K9zx86uzItuYFwWzznaByooYWFHnbQ5o4OrfNHM,20084
|
|
52
|
-
eodag/plugins/search/build_search_result.py,sha256=
|
|
53
|
-
eodag/plugins/search/cop_marine.py,sha256
|
|
52
|
+
eodag/plugins/search/build_search_result.py,sha256=Dr3VRMTvAfzhgkJL5wD_K3ok5gXcSkjDR0vaQ7dIrhs,58777
|
|
53
|
+
eodag/plugins/search/cop_marine.py,sha256=LpbkGKa-SsHXLqBiRIgFy-AgwAZsxuJuaAFDd7hKHYo,20725
|
|
54
54
|
eodag/plugins/search/creodias_s3.py,sha256=q-fzgKIp9hPgcxZ1fQz8N7veDdqZVZuVvygGOIA9zf0,3845
|
|
55
55
|
eodag/plugins/search/csw.py,sha256=de8CNjz4bjEny27V0RXC7V8LRz0Ik3yqQVjTAc_JlyA,12548
|
|
56
56
|
eodag/plugins/search/data_request_search.py,sha256=m38kpTXJT2fC8Mk894KlxKb14dz-nhAs_71-5kpnehU,27461
|
|
@@ -60,8 +60,8 @@ eodag/plugins/search/static_stac_search.py,sha256=CPynjpNw0gXa6g6hA2zSkbwhfgU-9I
|
|
|
60
60
|
eodag/resources/ext_collections.json,sha256=q_XP7evZIdYZJvjucMlDqMBERJnlggcqCeAUmJbw1gU,2586798
|
|
61
61
|
eodag/resources/ext_product_types.json,sha256=5AHQ6O8BqilEQBoXWDdb12FZHJW1CHEfHJPe-RmPKzI,2526068
|
|
62
62
|
eodag/resources/locations_conf_template.yml,sha256=_eBv-QKHYMIKhY0b0kp4Ee33RsayxN8LWH3kDXxfFSk,986
|
|
63
|
-
eodag/resources/product_types.yml,sha256=
|
|
64
|
-
eodag/resources/providers.yml,sha256=
|
|
63
|
+
eodag/resources/product_types.yml,sha256=Cj6DvEA3GIRmbWOfR6W4qac2OVs6l0SCMXqx1_2yw-8,427234
|
|
64
|
+
eodag/resources/providers.yml,sha256=0zEGBfyZSZLDg4WgaLnoxQgqvwRntff9QZPdn93uTUY,232731
|
|
65
65
|
eodag/resources/stac.yml,sha256=QnrBulL2pHZrPH4pI7rQtKDxmgP2ZbBcufFqFJPCL7A,10473
|
|
66
66
|
eodag/resources/stac_api.yml,sha256=2FdQL_qBTIUlu6KH836T4CXBKO9AvVxA_Ub3J1RP81A,68881
|
|
67
67
|
eodag/resources/stac_provider.yml,sha256=0nldbieF2CGf6QyqjEa-R96V3H1pV-jJwzRmaS2VzaQ,6804
|
|
@@ -93,11 +93,11 @@ eodag/rest/utils/rfc3339.py,sha256=28I4IGoXq6NCnc5s5YVgOMMl_xfbGZqnX40qKDbglqo,2
|
|
|
93
93
|
eodag/types/__init__.py,sha256=CCNBBM1NTq5UkN7s5zdl-uZdT8nOGX0z9Y8g7kwEyAw,16150
|
|
94
94
|
eodag/types/bbox.py,sha256=jbfX58KOKIl0OoGZc93kAYhG_mEOjuBQGJtR2hl3-_Y,4354
|
|
95
95
|
eodag/types/download_args.py,sha256=urSl5KbLRN1XetMa2XzxYltny8CCFmHpjxU3j3BEGO8,1565
|
|
96
|
-
eodag/types/queryables.py,sha256=
|
|
96
|
+
eodag/types/queryables.py,sha256=H4OHOvalH3j64_u6hV1ubikxjeCsLKUX-5KO4cJvQT0,10581
|
|
97
97
|
eodag/types/search_args.py,sha256=EtG8nXnApBnYrFo5FVvsvvEqRlqTxJ0lrmIem9Wtg8c,5649
|
|
98
|
-
eodag/utils/__init__.py,sha256=
|
|
98
|
+
eodag/utils/__init__.py,sha256=ZU4Wmf3ldURFwWnpd7vJNj7rsyFjTm_hfnKVlIZZd8I,55875
|
|
99
99
|
eodag/utils/cache.py,sha256=UNvnzhJnNBuKLdH_0KnhuTMlBvz4GS3nr2IH2Lj6Swc,2580
|
|
100
|
-
eodag/utils/dates.py,sha256=
|
|
100
|
+
eodag/utils/dates.py,sha256=nUIcGo1i9o2Lwv2A44vaAPh7V2ml_uEzw_6FdO9zOCQ,7876
|
|
101
101
|
eodag/utils/env.py,sha256=_sgCzDmaJnMnCv1qk9xe9jBhBKqqXbEYmsyGYwYw4NI,1085
|
|
102
102
|
eodag/utils/exceptions.py,sha256=64M6xNsWWThEspIrZvxPYCS47wBH4PL7YXXw8fcPCbo,4588
|
|
103
103
|
eodag/utils/free_text_search.py,sha256=et6nn5qmzbUq0T9tup6M2kMCwn2CvQgwVq6M6XOKEpg,8057
|
|
@@ -108,9 +108,9 @@ eodag/utils/repr.py,sha256=o6NhScogBPI69m83GsHh3hXONb9-byPfuWgJ1U39Kfw,5463
|
|
|
108
108
|
eodag/utils/requests.py,sha256=avNHKrOZ7Kp6lUA7u4kqupIth9MoirLzDsMrrmQDt4s,4560
|
|
109
109
|
eodag/utils/s3.py,sha256=eESanPLVv-Luqo_o1WgUuO7YLqiXg_iEzHZ15fu-ugY,30063
|
|
110
110
|
eodag/utils/stac_reader.py,sha256=8r6amio5EtwGF9iu9zHaGDz4oUPKKeXRuyTzPNakrO4,9406
|
|
111
|
-
eodag-3.10.
|
|
112
|
-
eodag-3.10.
|
|
113
|
-
eodag-3.10.
|
|
114
|
-
eodag-3.10.
|
|
115
|
-
eodag-3.10.
|
|
116
|
-
eodag-3.10.
|
|
111
|
+
eodag-3.10.1.dist-info/licenses/LICENSE,sha256=4MAecetnRTQw5DlHtiikDSzKWO1xVLwzM5_DsPMYlnE,10172
|
|
112
|
+
eodag-3.10.1.dist-info/METADATA,sha256=NKPU9iy7L5Y99awIn7rtGxlo24xLRA86ICfmcxGMo4A,15835
|
|
113
|
+
eodag-3.10.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
114
|
+
eodag-3.10.1.dist-info/entry_points.txt,sha256=4b6l049qcMbT60_9GebzhtCOVWLGa66_-sesZWqzLQg,2519
|
|
115
|
+
eodag-3.10.1.dist-info/top_level.txt,sha256=025IMTmVe5eDjIPP4KEFQKespOPMQdne4U4jOy8nftM,6
|
|
116
|
+
eodag-3.10.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|