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 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
- kwargs,
2328
+ kwargs_alias,
2323
2329
  available_product_types,
2324
2330
  product_type_configs,
2325
2331
  product_type,
@@ -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
- raise MisconfiguredError(
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
- self.geometry = self.search_intersection = get_geometry_from_various(
156
- geometry=product_geometry
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 (GEOSException, ShapelyError):
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 GEOSException:
107
+ except ShapelyError:
112
108
  logger.debug(
113
109
  "Product geometry still invalid. Overlap test restricted to containment"
114
110
  )
@@ -716,7 +716,7 @@ class AwsDownload(Download):
716
716
  ignore_assets,
717
717
  product,
718
718
  )
719
- if auth and isinstance(auth, boto3.resources.base.ServiceResource):
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 is_range_in_range
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
- processed_filters = self._preprocess_search_params(
701
- deepcopy(filters), product_type
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 filters:
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
- "geom",
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, (list, tuple)) else [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 values with /to/. We need to split it to an array
887
- # ECMWF accept values in format val1/val2. We need to split it to an array
888
- sep = re.compile(r"/to/|/")
889
- filter_v = [i for v in filter_v for i in sep.split(str(v))]
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 1 of the Fundamental Data Record (FDR) brightness
1556
- temperatures from the High Resolution Infrared Radiation Sounder (HIRS) on
1557
- board NOAA and Metop satellites. The data record covers more than 40 years
1558
- from 29 October 1978 to 31 December 2020. Release 1 provides recalibrated
1559
- Level 1c brightness temperatures based on the V4.0 calibration method
1560
- developed by Cao et al. (2007). This method was implemented into the
1561
- NWP-SAF software ATOVS and AVHRR processing Package (AAPP). This software
1562
- was consistently used to recalibrate and reprocess data from all HIRS
1563
- instruments on board TIROS-N, NOAA-06 to NOAA-19, Metop-A, and Metop-B. The
1564
- polygons, required for the data tailoring, show problems with non-continues
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 1 - Multimission - Global
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: |
@@ -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:0647
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
- # 1000 is ok and 2000 fails
6012
- max_items_per_page: 1000
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: MUSCATE_SENTINEL2_SENTINEL2_L2A
6099
+ productType: THEIA_REFLECTANCE_SENTINEL2_L2A
6093
6100
  S2_MSI_L2B_MAJA_SNOW:
6094
- productType: MUSCATE_Snow_SENTINEL2_L2B-SNOW
6101
+ productType: THEIA_SNOW_SENTINEL2_L2B
6095
6102
  S2_MSI_L2B_MAJA_WATER:
6096
- productType: MUSCATE_WaterQual_SENTINEL2_L2B-WATER
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
- # 1000 is ok and 2000 fails
6137
- max_items_per_page: 1000
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: MUSCATE_SENTINEL2_SENTINEL2_L2A
6224
+ productType: THEIA_REFLECTANCE_SENTINEL2_L2A
6218
6225
  S2_MSI_L2B_MAJA_SNOW:
6219
- productType: MUSCATE_Snow_SENTINEL2_L2B-SNOW
6226
+ productType: THEIA_SNOW_SENTINEL2_L2B
6220
6227
  S2_MSI_L2B_MAJA_WATER:
6221
- productType: MUSCATE_WaterQual_SENTINEL2_L2B-WATER
6228
+ productType: THEIA_WATERQUAL_SENTINEL2_L2B
6222
6229
  GENERIC_PRODUCT_TYPE:
6223
6230
  productType: '{productType}'
6224
6231
  download: !plugin
eodag/types/queryables.py CHANGED
@@ -91,6 +91,7 @@ class Queryables(CommonQueryables):
91
91
  Union[str, dict[str, float], BaseGeometry],
92
92
  Field(
93
93
  None,
94
+ alias="geometry",
94
95
  description="Read EODAG documentation for all supported geometry format.",
95
96
  ),
96
97
  ]
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.0
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,<2.12.0,>=2.1.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.0
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=iBX19BZv2UJrFWZwDvZmG7StKVvlv0RsjmJAqqLTnpQ,109126
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=UXCaWUtkAGWVCfF68zWCYDoEUUfxAdC0RGaNLZ3vUQ8,26794
12
- eodag/api/product/metadata_mapping.py,sha256=oACFPL14EdbIzD83Voi81-sFts_VD9N-3OsX5IN9hFg,79186
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=EkOyHEXFMrLQ7ZlTbzNs9lXZVDsbYTwgkPPK4JAkalY,4426
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=mkm5_ljgK_7QOOp-KgJjDjbVfss4gwRjIYUTMyKrw5o,7272
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=ZTszeNNU_JZesnINVMpW_7lPCBc0_MA4Xi_7AqTZxjA,46713
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=1yyzOc1c5gpfQlmoJEIU3gVP0iT_XqzZSxV9oitG4KQ,57689
53
- eodag/plugins/search/cop_marine.py,sha256=-GrFQjVZb7SfS6BbI0wnGc2VuRcQu7aqtWg3EWjQhE0,20485
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=4qEeKi7rYGTBWmNAsqk40ml-tD4V0AMeiZxqkN7TYhM,422350
64
- eodag/resources/providers.yml,sha256=BKxaV9wSWCdoy_PLGnNwjp7-3vBS3vEvUv3TI226eE8,232043
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=1Bb-n05YKSUq-rsVm-_2HoYaCBWp4SFHI4uWngpRmiw,10551
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=vLeA5MAskrfmMaB0j37ZpwlCqj2hjEEXEzt6nN5NtFU,54437
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=dSKmWC3spQrpo0XLYAnUe32k3SPHQ9yih_K3nQ7z1fE,7470
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.0.dist-info/licenses/LICENSE,sha256=4MAecetnRTQw5DlHtiikDSzKWO1xVLwzM5_DsPMYlnE,10172
112
- eodag-3.10.0.dist-info/METADATA,sha256=tPcEC8TjW6HoXZB8XZ-GsnYEY1E_jcXht20ZjemEJjs,15530
113
- eodag-3.10.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
114
- eodag-3.10.0.dist-info/entry_points.txt,sha256=4b6l049qcMbT60_9GebzhtCOVWLGa66_-sesZWqzLQg,2519
115
- eodag-3.10.0.dist-info/top_level.txt,sha256=025IMTmVe5eDjIPP4KEFQKespOPMQdne4U4jOy8nftM,6
116
- eodag-3.10.0.dist-info/RECORD,,
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