diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8cf3d432a2b739d0dd56dfe493efed6ea9142a73..95a69278871506d47fcacaa393c89233aa70bc15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -69,3 +69,7 @@ indexation: script: - pytest -o log_cli=true --log-cli-level=INFO --junitxml=report_indexation_test.xml test/indexation_test.py +dates: + extends: .test_base + script: + - pytest -o log_cli=true --log-cli-level=INFO --junitxml=report_dates_test.xml test/dates_test.py diff --git a/test/download_test.py b/apps/s2_download.py similarity index 100% rename from test/download_test.py rename to apps/s2_download.py diff --git a/scenes/dates.py b/scenes/dates.py index 107ba7efeb26399765a93b06e8d1886ebf433198..4622b82858b6f223859c62de20102afd065c7405 100644 --- a/scenes/dates.py +++ b/scenes/dates.py @@ -5,6 +5,19 @@ This module aims to deal with dates import datetime +def get_timestamp(dt): + """Converts datetime.datetime into a timestamp (in seconds) + + Args: + dt: datetime.datetime instance + + Returns: + timestamp (in seconds) + + """ + return dt.replace(tzinfo=datetime.timezone.utc).timestamp() + + def str2datetime(datestr): """ Converts an input date as string into a datetime instance. diff --git a/scenes/indexation.py b/scenes/indexation.py index 63578ec306114e274ee8fdc181732c4a765d92f7..0c97285fdb70fc6f0b9c77b0716912a3363cf1e7 100644 --- a/scenes/indexation.py +++ b/scenes/indexation.py @@ -3,52 +3,23 @@ This module contains stuff for the spatio-temporal indexation of scenes. """ import datetime import rtree +from scenes.dates import get_timestamp, any2datetime -def get_timestamp(dt): - """Converts datetime.datetime into a timestamp (in seconds) - - Args: - dt: datetime.datetime instance - - Returns: - timestamp (in seconds) - - """ - return dt.replace(tzinfo=datetime.timezone.utc).timestamp() - - -def new_bbox(bbox_wgs84, dt): - """Return a bounding box in the domain (lat, lon, time) - - Args: - bbox_wgs84: Bounding box (in WGS84) - dt: date datetime.datetime - - Returns: - item for rtree - - """ - dt_min = dt - datetime.timedelta(days=1) - dt_max = dt + datetime.timedelta(days=1) - - return bbox(bbox_wgs84=bbox_wgs84, dt_min=dt_min, dt_max=dt_max) - - -def bbox(bbox_wgs84, dt_min, dt_max): +def _bbox(bbox_wgs84, date_min, date_max): """Return a bounding box in the domain (lat, lon, time) Args: bbox_wgs84: The bounding box in WGS84 (BoundingBox instance) - dt_min: date min (datetime.datetime) - dt_max: date max (datetime.datetime) + date_min: date min (datetime.datetime or str) + date_max: date max (datetime.datetime or str) Returns: item for rtree """ - return (bbox_wgs84.xmin, bbox_wgs84.ymin, get_timestamp(dt_min), - bbox_wgs84.xmax, bbox_wgs84.ymax, get_timestamp(dt_max)) + return (bbox_wgs84.xmin, bbox_wgs84.ymin, get_timestamp(any2datetime(date_min)), + bbox_wgs84.xmax, bbox_wgs84.ymax, get_timestamp(any2datetime(date_max))) class Index: @@ -66,38 +37,42 @@ class Index: properties.dimension = 3 self.index = rtree.index.Index(properties=properties) for scene_idx, scene in enumerate(scenes_list): - self.index.insert(scene_idx, new_bbox(bbox_wgs84=scene.bbox_wgs84, dt=scene.acquisition_date)) + dt = scene.acquisition_date + dt_min = dt - datetime.timedelta(days=1) + dt_max = dt + datetime.timedelta(days=1) + new_bbox = _bbox(bbox_wgs84=scene.bbox_wgs84, date_min=dt_min, date_max=dt_max) + self.index.insert(scene_idx, new_bbox) - def find_indices(self, bbox_wgs84, dt_min=None, dt_max=None): + def find_indices(self, bbox_wgs84, date_min=None, date_max=None): """Search the intersecting elements, and return their indices Args: bbox_wgs84: The bounding box in WGS84 (BoundingBox instance) - dt_min: date min (datetime.datetime) (Default value = None) - dt_max: date max (datetime.datetime) (Default value = None) + date_min: date min (datetime.datetime or str) (Default value = None) + date_max: date max (datetime.datetime or str) (Default value = None) Returns: list of indices """ - if not dt_min: - dt_min = datetime.datetime.strptime("2000-01-01", "%Y-%m-%d") - if not dt_max: - dt_max = datetime.datetime.strptime("3000-01-01", "%Y-%m-%d") - bbox_search = bbox(bbox_wgs84=bbox_wgs84, dt_min=dt_min, dt_max=dt_max) + if not date_min: + date_min = datetime.datetime.strptime("2000-01-01", "%Y-%m-%d") + if not date_max: + date_max = datetime.datetime.strptime("3000-01-01", "%Y-%m-%d") + bbox_search = _bbox(bbox_wgs84=bbox_wgs84, date_min=date_min, date_max=date_max) return self.index.intersection(bbox_search) - def find(self, bbox_wgs84, dt_min=None, dt_max=None): + def find(self, bbox_wgs84, date_min=None, date_max=None): """Search the intersecting elements, and return them Args: bbox_wgs84: The bounding box in WGS84 (BoundingBox instance) - dt_min: date min (datetime.datetime) (Default value = None) - dt_max: date max (datetime.datetime) (Default value = None) + date_min: date min (datetime.datetime or str) (Default value = None) + date_max: date max (datetime.datetime or str) (Default value = None) Returns: list of indices """ - indices = self.find_indices(bbox_wgs84=bbox_wgs84, dt_min=dt_min, dt_max=dt_max) + indices = self.find_indices(bbox_wgs84=bbox_wgs84, date_min=date_min, date_max=date_max) return [self.scenes_list[i] for i in indices] diff --git a/test/dates_test.py b/test/dates_test.py new file mode 100644 index 0000000000000000000000000000000000000000..f3b1a86d830936dd542315d9017b08c76be80e1b --- /dev/null +++ b/test/dates_test.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from scenes_test_base import ScenesTestBase +import datetime +from scenes import Index, BoundingBox, dates + +class DatesTest(ScenesTestBase): + + + def test_input_dates_formats(self): + datestr1 = "04/10/1986" + datestr2 = "04-10-1986" + datestr3 = "1986-10-04" + dt = datetime.datetime(year=1986, month=10, day=4) + + assert dates.any2datetime(datestr1) == dt + assert dates.any2datetime(datestr2) == dt + assert dates.any2datetime(datestr3) == dt + + # Index test + idx = Index([]) + dummy_bbox = BoundingBox(0, 0, 0, 0) + _ = idx.find(dummy_bbox, date_min=datestr1) + _ = idx.find(dummy_bbox, date_min=datestr2) + _ = idx.find(dummy_bbox, date_min=datestr3) + + +if __name__ == '__main__': + unittest.main()