From 6ad3880b59af0c0c352150afa7067d780ae5b86f Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Fri, 9 Aug 2024 22:36:06 +0300 Subject: [PATCH 1/7] Use get with cloudCover --- src/imagery/i.eodag/i.eodag.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/imagery/i.eodag/i.eodag.py b/src/imagery/i.eodag/i.eodag.py index 28c0038a08..fbc216b08b 100755 --- a/src/imagery/i.eodag/i.eodag.py +++ b/src/imagery/i.eodag/i.eodag.py @@ -813,14 +813,20 @@ def products_compare(first, second): for sort_key in sort_keys: if sort_key == "ingestiondate": if "startTimeFromAscendingNode" not in first.properties: + gs.warning( + _("Could not sort by ingestion date, please report this issue") + ) + continue + if "startTimeFromAscendingNode" not in second.properties: + gs.warning( + _("Could not sort by ingestion date, please report this issue") + ) continue first_value = first.properties["startTimeFromAscendingNode"] second_value = second.properties["startTimeFromAscendingNode"] elif sort_key == "cloudcover": - if "cloudCover" not in first.properties: - continue - first_value = first.properties["cloudCover"] - second_value = second.properties["cloudCover"] + first_value = first.properties.get("cloudCover", int(1e9)) + second_value = second.properties.get("cloudCover", int(1e9)) elif sort_key == "footprint": # Sort by title lexicographically first_value = first.properties["title"] From 951b3cc83f990176978513485058f56222f9605d Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Wed, 14 Aug 2024 02:23:55 +0300 Subject: [PATCH 2/7] Add warnings --- src/imagery/i.eodag/i.eodag.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/imagery/i.eodag/i.eodag.py b/src/imagery/i.eodag/i.eodag.py index fbc216b08b..236a81ae17 100755 --- a/src/imagery/i.eodag/i.eodag.py +++ b/src/imagery/i.eodag/i.eodag.py @@ -825,9 +825,35 @@ def products_compare(first, second): first_value = first.properties["startTimeFromAscendingNode"] second_value = second.properties["startTimeFromAscendingNode"] elif sort_key == "cloudcover": + if "cloudCover" not in first.properties: + gs.warning( + _( + "Cloud cover not available for scene {}".format( + first.properties.get("title", "NA") + ) + ) + ) + if "cloudCover" not in second.properties: + gs.warning( + _( + "Cloud cover not available for scene {}".format( + second.properties.get("title", "NA") + ) + ) + ) first_value = first.properties.get("cloudCover", int(1e9)) second_value = second.properties.get("cloudCover", int(1e9)) elif sort_key == "footprint": + if "title" not in first.properties: + gs.warning( + _("Could not sort by footprint, please report this issue") + ) + continue + if "title" not in second.properties: + gs.warning( + _("Could not sort by footprint, please report this issue") + ) + continue # Sort by title lexicographically first_value = first.properties["title"] second_value = second.properties["title"] From 962d8f7854023790a52d27b529ed7374887093cc Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Sun, 18 Aug 2024 23:14:20 +0300 Subject: [PATCH 3/7] Use lambda function for the sorting implementation --- src/imagery/i.eodag/i.eodag.py | 73 +++++++--------------------------- 1 file changed, 14 insertions(+), 59 deletions(-) diff --git a/src/imagery/i.eodag/i.eodag.py b/src/imagery/i.eodag/i.eodag.py index 236a81ae17..458cc05cc5 100755 --- a/src/imagery/i.eodag/i.eodag.py +++ b/src/imagery/i.eodag/i.eodag.py @@ -805,65 +805,20 @@ def sort_result(search_result): :return: Sorted EO products :rtype: class:'eodag.api.search_result.SearchResult' """ - sort_keys = options["sort"].split(",") - sort_order = options["order"] - - # Sort keys and sort orders are matched respectively - def products_compare(first, second): - for sort_key in sort_keys: - if sort_key == "ingestiondate": - if "startTimeFromAscendingNode" not in first.properties: - gs.warning( - _("Could not sort by ingestion date, please report this issue") - ) - continue - if "startTimeFromAscendingNode" not in second.properties: - gs.warning( - _("Could not sort by ingestion date, please report this issue") - ) - continue - first_value = first.properties["startTimeFromAscendingNode"] - second_value = second.properties["startTimeFromAscendingNode"] - elif sort_key == "cloudcover": - if "cloudCover" not in first.properties: - gs.warning( - _( - "Cloud cover not available for scene {}".format( - first.properties.get("title", "NA") - ) - ) - ) - if "cloudCover" not in second.properties: - gs.warning( - _( - "Cloud cover not available for scene {}".format( - second.properties.get("title", "NA") - ) - ) - ) - first_value = first.properties.get("cloudCover", int(1e9)) - second_value = second.properties.get("cloudCover", int(1e9)) - elif sort_key == "footprint": - if "title" not in first.properties: - gs.warning( - _("Could not sort by footprint, please report this issue") - ) - continue - if "title" not in second.properties: - gs.warning( - _("Could not sort by footprint, please report this issue") - ) - continue - # Sort by title lexicographically - first_value = first.properties["title"] - second_value = second.properties["title"] - if first_value < second_value: - return 1 if sort_order == "desc" else -1 - elif first_value > second_value: - return -1 if sort_order == "desc" else 1 - return 0 - - search_result.sort(key=cmp_to_key(products_compare)) + sort_keys = list() + for sort_key in options["sort"].split(","): + if sort_key == "ingestiondate": + sort_keys.append(("startTimeFromAscendingNode", "3000-12-31T00:00:00")) + if sort_key == "title": + sort_keys.append(("title", "Z" * 100)) + if sort_key == "cloudcover": + sort_keys.append(("cloudCover", int(1e9))) + search_result.sort( + reverse=options["order"] == "desc", + key=lambda product: [ + product.properties.get(sort_key, default) for sort_key, default in sort_keys + ], + ) return search_result From e4e1e9e3e36ab3b59ea7608e898ce7d6038b5e28 Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Sun, 18 Aug 2024 23:30:15 +0300 Subject: [PATCH 4/7] Set default values according to the order option --- src/imagery/i.eodag/i.eodag.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/imagery/i.eodag/i.eodag.py b/src/imagery/i.eodag/i.eodag.py index a9fb51579b..5e5df4bea3 100755 --- a/src/imagery/i.eodag/i.eodag.py +++ b/src/imagery/i.eodag/i.eodag.py @@ -828,11 +828,23 @@ def sort_result(search_result): sort_keys = list() for sort_key in options["sort"].split(","): if sort_key == "ingestiondate": - sort_keys.append(("startTimeFromAscendingNode", "3000-12-31T00:00:00")) + sort_keys.append( + ( + "startTimeFromAscendingNode", + ( + "3000-12-31T00:00:00" + if options["order"] == "asc" + else "1000-01-01T00:00:00" + ), + ) + ) if sort_key == "title": - sort_keys.append(("title", "Z" * 100)) + sort_keys.append(("title", "Z" * 100 if options["order"] == "asc" else "A")) if sort_key == "cloudcover": - sort_keys.append(("cloudCover", int(1e9))) + sort_keys.append( + ("cloudCover", int(1e9) * 1 if options["order"] == "asc" else -1) + ) + # Default values are used to put scenes with missing sorting key at the end search_result.sort( reverse=options["order"] == "desc", key=lambda product: [ From f2fe26b07bbbb4de533ea61d2e0d8aeb8831c989 Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Mon, 19 Aug 2024 01:09:31 +0300 Subject: [PATCH 5/7] Patch no_fallback_search --- src/imagery/i.eodag/i.eodag.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/imagery/i.eodag/i.eodag.py b/src/imagery/i.eodag/i.eodag.py index 5e5df4bea3..c795ab3efe 100755 --- a/src/imagery/i.eodag/i.eodag.py +++ b/src/imagery/i.eodag/i.eodag.py @@ -481,10 +481,7 @@ def no_fallback_search(search_parameters, provider): try: if int(eodag.__version__.split(".")[0]) < 3: server_poke = dag.search(**search_parameters, provider=provider) - elif ( - int(eodag.__version__.split(".")[0]) >= 3 - and server_poke.number_matched == 0 - ): + elif int(eodag.__version__.split(".")[0]) >= 3: server_poke = dag.search(**search_parameters, provider=provider, count=True) if (int(eodag.__version__.split(".")[0]) < 3 and server_poke[1] == 0) or ( int(eodag.__version__.split(".")[0]) >= 3 From 1367a87dec0390401012d08d72f88e5f5208636c Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Mon, 19 Aug 2024 16:17:23 +0300 Subject: [PATCH 6/7] Use artificial keys for sorting --- src/imagery/i.eodag/i.eodag.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/imagery/i.eodag/i.eodag.py b/src/imagery/i.eodag/i.eodag.py index c795ab3efe..bcfb1e21a1 100755 --- a/src/imagery/i.eodag/i.eodag.py +++ b/src/imagery/i.eodag/i.eodag.py @@ -825,27 +825,20 @@ def sort_result(search_result): sort_keys = list() for sort_key in options["sort"].split(","): if sort_key == "ingestiondate": - sort_keys.append( - ( - "startTimeFromAscendingNode", - ( - "3000-12-31T00:00:00" - if options["order"] == "asc" - else "1000-01-01T00:00:00" - ), - ) - ) + sort_keys.append("startTimeFromAscendingNode") if sort_key == "title": - sort_keys.append(("title", "Z" * 100 if options["order"] == "asc" else "A")) + sort_keys.append("title") if sort_key == "cloudcover": - sort_keys.append( - ("cloudCover", int(1e9) * 1 if options["order"] == "asc" else -1) - ) + sort_keys.append("cloudCover") # Default values are used to put scenes with missing sorting key at the end search_result.sort( reverse=options["order"] == "desc", key=lambda product: [ - product.properties.get(sort_key, default) for sort_key, default in sort_keys + ( + (sort_key not in product.properties) ^ (options["order"] == "desc"), + product.properties.get(sort_key, None), + ) + for sort_key in sort_keys ], ) return search_result From bf0d28d3fd5a2a0d66dd2dffcb67e803fe98946e Mon Sep 17 00:00:00 2001 From: Hamed Elgizery Date: Mon, 19 Aug 2024 16:26:28 +0300 Subject: [PATCH 7/7] Add a note that start, end, and ingestiondate refer to the sensing time --- src/imagery/i.eodag/i.eodag.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/imagery/i.eodag/i.eodag.html b/src/imagery/i.eodag/i.eodag.html index ef00ee7365..bd8e4fd4b5 100644 --- a/src/imagery/i.eodag/i.eodag.html +++ b/src/imagery/i.eodag/i.eodag.html @@ -17,7 +17,9 @@

WARNING: I.EODAG IS UNDER DEVELOPMENT. THIS IS AN EXPERIMENTAL VERSION.

To only list available scenes, l flag must be set. If no start or end dates are provided, the module will search scenes from the -past 60 days. +past 60 days. Note that the dates used for searching start, end, +in addition to ingestiondate, which is displayed when listing found scenes, +refer to the sensing time of the scene.

To download all scenes found within the time frame provided, users must