From 261e69d5b176284e8d042fc31ccf3d027593bd0e Mon Sep 17 00:00:00 2001 From: kamangir Date: Mon, 7 Oct 2024 18:59:40 -0700 Subject: [PATCH 1/6] =?UTF-8?q?start=20of=20watch-targets-refactors-2024-1?= =?UTF-8?q?0-07-33560=20=F0=9F=AA=84=20-=20kamangir/bolt#746?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- blue_geo/__init__.py | 2 +- blue_geo/watch/README.md | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c3d23b56..e17864a6 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ to use on [AWS SageMaker](https://aws.amazon.com/sagemaker/) replace ` Date: Mon, 7 Oct 2024 20:18:42 -0700 Subject: [PATCH 2/6] target refactors - kamangir/bolt#746 --- README.md | 2 +- blue_geo/.abcli/actions.sh | 6 ++ ...{watch_targets.sh => watch_targets_get.sh} | 21 ----- blue_geo/.abcli/tests/watch_targets_list.sh | 22 +++++ blue_geo/.abcli/tests/watch_targets_save.sh | 24 ++++++ blue_geo/.abcli/watch.sh | 4 +- blue_geo/.abcli/watch/targets.sh | 26 +++++- blue_geo/__init__.py | 2 +- blue_geo/help/watch/targets.py | 13 +-- blue_geo/tests/test_target.py | 81 +++++------------- blue_geo/tests/test_target_list.py | 85 +++++++++++++++++++ blue_geo/watch/README.md | 26 +++--- blue_geo/watch/targets/__main__.py | 5 +- blue_geo/watch/targets/classes.py | 70 +++++++++++---- blue_geo/watch/template.md | 2 +- 15 files changed, 265 insertions(+), 124 deletions(-) rename blue_geo/.abcli/tests/{watch_targets.sh => watch_targets_get.sh} (80%) create mode 100644 blue_geo/.abcli/tests/watch_targets_list.sh create mode 100644 blue_geo/.abcli/tests/watch_targets_save.sh create mode 100644 blue_geo/tests/test_target_list.py diff --git a/README.md b/README.md index e17864a6..5dd10219 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ to use on [AWS SageMaker](https://aws.amazon.com/sagemaker/) replace ` str: - args = [ - "[--target_name ]", - "[--object_name ]", - ] + options = "target=all|" return show_usage( - ["@targets save"] + args, - "save -> .", + [ + "@targets save", + f"[{options}]", + "[.|]", + ], + "save target(s) -> .", mono=mono, ) diff --git a/blue_geo/tests/test_target.py b/blue_geo/tests/test_target.py index e048a860..c4e1e078 100644 --- a/blue_geo/tests/test_target.py +++ b/blue_geo/tests/test_target.py @@ -1,77 +1,36 @@ import pytest +from shapely.geometry import Polygon -from blue_objects import file +from blue_objects import file, objects -from blue_geo.watch.targets.classes import Target, TargetList - - -@pytest.fixture -def target_list(): - return TargetList(download=True) - - -def test_target(target_list: TargetList): - target = target_list.list_of_targets["elkhema"] - - assert target.one_liner +from blue_geo.tests.test_target_list import target_list +from blue_geo.watch.targets import TargetList, Target @pytest.mark.parametrize( - ["catalog_name", "collection", "expected_target"], - [ - ["SkyFox", "Venus", "Leonardo"], - ["EarthSearch", "sentinel_2_l1c", "burning-man-2024"], - ], + ["target_name"], + [["elkhema"]], ) -def test_target_list( - catalog_name: str, - collection: str, - expected_target: str, +def test_target( target_list: TargetList, + target_name: str, ): - assert target_list.list_of_targets - - assert target_list.test() - - assert target_list.object_name + target = target_list.list_of_targets[target_name] - assert file.exists(target_list.filename()) - - list_of_targets = target_list.get_list( - catalog_name=catalog_name, - collection=collection, - ) + assert isinstance(target, Target) - assert expected_target in list_of_targets - - -def test_targets_load(target_list: TargetList): - assert target_list.list_of_targets + assert target.one_liner - for target in target_list.list_of_targets.values(): - assert isinstance(target, Target) + polygon = target.polygon + assert isinstance(polygon, Polygon) - for target in ["chilcotin-river-landslide", "elkhema"]: - assert target in target_list.list_of_targets + object_name = objects.unique_object() + assert target.save(object_name) -def test_targets_get( - target_list: TargetList, -): - target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh") - assert target.query_args["datetime"] == "2024-05-01/2024-09-01" - - target = target_list.get( - "bellingcat-2024-09-27-nagorno-karabakh-test", - including_versions=False, + assert file.exists( + objects.path_of( + filename="target/shape.geojson", + object_name=object_name, + ) ) - assert not "count" in target.query_args - - target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh-void") - assert not "count" in target.query_args - - target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh") - assert target.query_args["count"] == 30 - - target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh-test") - assert target.query_args["count"] == 2 diff --git a/blue_geo/tests/test_target_list.py b/blue_geo/tests/test_target_list.py new file mode 100644 index 00000000..c432712b --- /dev/null +++ b/blue_geo/tests/test_target_list.py @@ -0,0 +1,85 @@ +import pytest + +from blue_objects import file, objects +from blue_geo.watch.targets.classes import Target, TargetList + + +@pytest.fixture +def target_list(): + return TargetList(download=True) + + +@pytest.mark.parametrize( + ["catalog_name", "collection", "expected_target"], + [ + ["SkyFox", "Venus", "Leonardo"], + ["EarthSearch", "sentinel_2_l1c", "burning-man-2024"], + ], +) +def test_target_list( + catalog_name: str, + collection: str, + expected_target: str, + target_list: TargetList, +): + assert target_list.list_of_targets + + assert target_list.test() + + assert target_list.object_name + + assert file.exists(target_list.filename()) + + list_of_targets = target_list.get_list( + catalog_name=catalog_name, + collection=collection, + ) + + assert expected_target in list_of_targets + + +def test_target_list_load(target_list: TargetList): + assert target_list.list_of_targets + + for target in target_list.list_of_targets.values(): + assert isinstance(target, Target) + + for target in ["chilcotin-river-landslide", "elkhema"]: + assert target in target_list.list_of_targets + + +def test_target_list_get( + target_list: TargetList, +): + target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh") + assert target.query_args["datetime"] == "2024-05-01/2024-09-01" + + target = target_list.get( + "bellingcat-2024-09-27-nagorno-karabakh-test", + including_versions=False, + ) + assert not "count" in target.query_args + + target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh-void") + assert not "count" in target.query_args + + target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh") + assert target.query_args["count"] == 30 + + target = target_list.get("bellingcat-2024-09-27-nagorno-karabakh-test") + assert target.query_args["count"] == 2 + + +def test_target_list_save( + target_list: TargetList, +): + object_name = objects.unique_object() + + assert target_list.save(object_name) + + assert file.exists( + objects.path_of( + filename="target/shape.geojson", + object_name=object_name, + ) + ) diff --git a/blue_geo/watch/README.md b/blue_geo/watch/README.md index e03dd3b3..be6120f4 100644 --- a/blue_geo/watch/README.md +++ b/blue_geo/watch/README.md @@ -69,9 +69,9 @@ watch the planet's story unfold. . publish watch targets. $BLUE_GEO_WATCH_TARGET_LIST: blue-geo-target-list-v1 @targets save \ - [--target_name ] \ - [--object_name ] - . save -> . + [target=all|] \ + [.|] + . save target(s) -> . @targets test . test watch targets. $BLUE_GEO_WATCH_TARGET_LIST: blue-geo-target-list-v1 @@ -80,7 +80,7 @@ watch the planet's story unfold. $BLUE_GEO_WATCH_TARGET_LIST: blue-geo-target-list-v1 ``` -🎯 [`geo-watch-targets/metadata.yaml`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-targets/metadata.yaml). +🎯 [`geo-watch-targets/metadata.yaml`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-targets/metadata.yaml): [geojson](./targets.geojson). ## example run @@ -102,7 +102,7 @@ watch the planet's story unfold. - [Google Maps](https://maps.app.goo.gl/kHypmxiEeqdVrBi77): `lat: 56.2036"N`, `lon: 120.8943"W`. - [reddit](https://www.reddit.com/r/britishcolumbia/comments/1fho5vq/10_days_of_reservoir_filling_at_cache_creek_site/): 10 Days of reservoir filling at Cache Creek - Site C Hydroelectric Project, British Columbia, Canada. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Cache-Creek-2x-wider-2024-10-06-a/geo-watch-Cache-Creek-2x-wider-2024-10-06-a-4X.gif?raw=true&random=UjpCd8dVAv4mGufo) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Cache-Creek-2x-wider-2024-10-06-a/geo-watch-Cache-Creek-2x-wider-2024-10-06-a-4X.gif?raw=true&random=ejhH8dJeCfPCWote) - [`geo-watch-Cache-Creek-2024-10-06-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Cache-Creek-2024-10-06-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Cache-Creek-2024-10-06-a/geo-watch-Cache-Creek-2024-10-06-a.gif), [dev notes](https://medium.com/@arash-kamangir/%EF%B8%8F-conversations-with-ai-253-8f12ef5bd8fc). - [`geo-watch-Cache-Creek-2x-wider-2024-10-06-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Cache-Creek-2x-wider-2024-10-06-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Cache-Creek-2x-wider-2024-10-06-a/geo-watch-Cache-Creek-2x-wider-2024-10-06-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-256-c1b564c9f89e). @@ -110,7 +110,7 @@ watch the planet's story unfold. - [Google Maps](https://maps.app.goo.gl/zkdc2DNLahc598k48): `lat: 63.9000"N`, `lon: 22.2667"W`. - [Wikipedia](https://en.wikipedia.org/wiki/Fagradalsfjall): An active tuya volcano formed in the Last Glacial Period on the Reykjanes Peninsula. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Fagradalsfjall-a/geo-watch-2024-09-04-Fagradalsfjall-a-2X.gif?raw=true&random=SdTW6ydT9OUzewWx) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Fagradalsfjall-a/geo-watch-2024-09-04-Fagradalsfjall-a-2X.gif?raw=true&random=XWyABmkpqsQwN5vb) - [`geo-watch-2024-09-04-Fagradalsfjall-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Fagradalsfjall-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Fagradalsfjall-a/geo-watch-2024-09-04-Fagradalsfjall-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-206-f7996520dc15). ## [`Jasper`](./targets/Jasper.md) @@ -118,14 +118,14 @@ watch the planet's story unfold. - [Parks Canada](https://parks.canada.ca/pn-np/ab/jasper/visit/feu-alert-fire/feudeforet-wildfire): Wildfire status, Jasper Wildfire Complex. - [Wikipedia](https://en.wikipedia.org/wiki/2024_Jasper_wildfire) -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-06-Jasper-a/geo-watch-2024-09-06-Jasper-a-2X.gif?raw=true&random=70A22I9xLhu55Pof) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-06-Jasper-a/geo-watch-2024-09-06-Jasper-a-2X.gif?raw=true&random=93uPa1yZDV0MiziX) - [`geo-watch-2024-09-06-Jasper-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-06-Jasper-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-06-Jasper-a/geo-watch-2024-09-06-Jasper-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-208-7063fca1423b). ## [`Leonardo`](./targets/Leonardo.md) - [Google Maps](https://maps.app.goo.gl/Zpnj53kVcQQ4fNA17): `lat: 41.8100"N`, `lon: 12.2550"E`. - [Wikipedia](https://en.wikipedia.org/wiki/Rome_Fiumicino_Airport): The 9th busiest airport in Europe and the world's 46th-busiest airport with over 40.5 million passengers served in 2023. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Leonardo-2024-10-06-a/geo-watch-Leonardo-2024-10-06-a-4X.gif?raw=true&random=n85Bn20qB94fpeJH) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Leonardo-2024-10-06-a/geo-watch-Leonardo-2024-10-06-a-4X.gif?raw=true&random=o1bXqEI3r8ICusdh) - [`test_blue_geo_watch_v4-Leonardo-test`](https://kamangir-public.s3.ca-central-1.amazonaws.com/test_blue_geo_watch_v4-Leonardo-test.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/test_blue_geo_watch_v4-Leonardo-test/test_blue_geo_watch_v4-Leonardo-test.gif), [![bashtest](https://github.com/kamangir/blue-geo/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/blue-geo/actions/workflows/bashtest.yml). - [`geo-watch-2024-09-30-Leonardo-g`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-30-Leonardo-g.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-30-Leonardo-g/geo-watch-2024-09-30-Leonardo-g.gif), [dev notes](https://medium.com/@arash-kamangir/%EF%B8%8F-conversations-with-ai-237-99db71023445). - [`geo-watch-Leonardo-2024-10-05-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Leonardo-2024-10-05-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-Leonardo-2024-10-05-a/geo-watch-Leonardo-2024-10-05-a.gif), [dev notes](https://medium.com/@arash-kamangir/%EF%B8%8F-conversations-with-ai-249-44ba1dcd2321). @@ -135,13 +135,13 @@ watch the planet's story unfold. - [Google Maps](https://maps.app.goo.gl/vcCRk16tHBPxB3a47): `lat: 37.7510"N`, `lon: 14.9934"E`. - [Wikipedia](https://en.wikipedia.org/wiki/Mount_Etna): An active stratovolcano on the east coast of Sicily, Italy. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Mount-Etna-a/geo-watch-2024-09-04-Mount-Etna-a-2X.gif?raw=true&random=MmzAncKdzNltq7JB) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Mount-Etna-a/geo-watch-2024-09-04-Mount-Etna-a-2X.gif?raw=true&random=2CQlgzzeAtFdCPwL) - [`geo-watch-2024-09-04-Mount-Etna-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Mount-Etna-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-Mount-Etna-a/geo-watch-2024-09-04-Mount-Etna-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-205-c272a95ce266). ## `bellingcat-2024-09-27-nagorno-karabakh` - [Bellingcat](https://www.bellingcat.com/news/mena/2024/09/27/nagorno-karabakh-satellite-imagery-shows-city-wide-ransacking/): In the regional capital of Nagorno-Karabakh, satellite imagery reveals hundreds of incidents of what appears to be ransacking across the city of Khankendi, known as Stepanakert to Armenians. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-bellingcat-2024-09-27-nagorno-karabakh-6X-2024-10-06-a/geo-watch-bellingcat-2024-09-27-nagorno-karabakh-6X-2024-10-06-a-4X.gif?raw=true&random=SD9qEyJrzMXNjlyE) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-bellingcat-2024-09-27-nagorno-karabakh-6X-2024-10-06-a/geo-watch-bellingcat-2024-09-27-nagorno-karabakh-6X-2024-10-06-a-4X.gif?raw=true&random=dWE9iXd2dGGu6z2o) - [`bellingcat-2024-09-27-nagorno-karabakh-2024-10-01-c-b`](https://kamangir-public.s3.ca-central-1.amazonaws.com/bellingcat-2024-09-27-nagorno-karabakh-2024-10-01-c-b.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/bellingcat-2024-09-27-nagorno-karabakh-2024-10-01-c-b/bellingcat-2024-09-27-nagorno-karabakh-2024-10-01-c-b.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-241-3e25857747a5). - [`bellingcat-2024-09-27-nagorno-karabakh-b`](https://kamangir-public.s3.ca-central-1.amazonaws.com/bellingcat-2024-09-27-nagorno-karabakh-b.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/bellingcat-2024-09-27-nagorno-karabakh-b/bellingcat-2024-09-27-nagorno-karabakh-b.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-244-a5f9b7959748). - [`bellingcat-2024-09-27-nagorno-karabakh-6X-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/bellingcat-2024-09-27-nagorno-karabakh-6X-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/bellingcat-2024-09-27-nagorno-karabakh-6X-a/bellingcat-2024-09-27-nagorno-karabakh-6X-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-245-18f6d15e5fbd). @@ -151,7 +151,7 @@ watch the planet's story unfold. ## [`burning-man-2024`](./targets/burning-man-2024.md) - [Google Maps](https://maps.app.goo.gl/e58UsDThr8ryqCRa8): `lat: 40.7864"N`, `lon: 119.2065"W`. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-burning-man-2024-a/geo-watch-2024-09-04-burning-man-2024-a-2X.gif?raw=true&random=5A592RSaUPYupczF) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-burning-man-2024-a/geo-watch-2024-09-04-burning-man-2024-a-2X.gif?raw=true&random=rJkKAsJg0cGY87n8) - [`geo-watch-2024-09-04-burning-man-2024-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-burning-man-2024-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-04-burning-man-2024-a/geo-watch-2024-09-04-burning-man-2024-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-205-c272a95ce266). ## [`chilcotin-river-landslide`](./targets/chilcotin-river-landslide.md) @@ -160,7 +160,7 @@ watch the planet's story unfold. - [Reddit](https://www.reddit.com/r/britishcolumbia/comments/1eh9eql/before_and_after_satellite_images_of_the/): Before and after satellite images of the Chilcotin River landslide. - [portal](https://chilcotin-river-landslide-2024-bcgov03.hub.arcgis.com/): Chilcotin River Landslide Information Portal, source of ⬆️ image. -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-01-chilcotin-c/geo-watch-2024-09-01-chilcotin-c-2X.gif?raw=true&random=dVGxQw2FwLU5yyP8) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-01-chilcotin-c/geo-watch-2024-09-01-chilcotin-c-2X.gif?raw=true&random=1Jkb3rXoLDh94tDG) - [`test_blue_geo_watch_v4-chilcotin-river-landslide-test`](https://kamangir-public.s3.ca-central-1.amazonaws.com/test_blue_geo_watch_v4-chilcotin-river-landslide-test.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/test_blue_geo_watch_v4-chilcotin-river-landslide-test/test_blue_geo_watch_v4-chilcotin-river-landslide-test.gif), [![bashtest](https://github.com/kamangir/blue-geo/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/blue-geo/actions/workflows/bashtest.yml). - [`geo-watch-2024-08-31-chilcotin-c`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-08-31-chilcotin-c.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-08-31-chilcotin-c/geo-watch-2024-08-31-chilcotin-c.gif), L1C and L2A mixed, `2024-07-30/2024-08-09`, [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-199-11f9b5497ef0). - [`geo-watch-2024-09-01-chilcotin-a`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-01-chilcotin-a.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-2024-09-01-chilcotin-a/geo-watch-2024-09-01-chilcotin-a.gif), [dev notes](https://arash-kamangir.medium.com/%EF%B8%8F-conversations-with-ai-201-d64e9bb3716b). @@ -168,7 +168,7 @@ watch the planet's story unfold. ## `elkhema ⛺️` -![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-elkhema-2024-2024-10-05-a-b/geo-watch-elkhema-2024-2024-10-05-a-b-4X.gif?raw=true&random=mJAAR8N9QK4KHVh6) +![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-elkhema-2024-2024-10-05-a-b/geo-watch-elkhema-2024-2024-10-05-a-b-4X.gif?raw=true&random=vd3owqCQGAIiT5EK) - [`geo-watch-elkhema-2024-2024-10-05-a-b`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-elkhema-2024-2024-10-05-a-b.tar.gz), [gif](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-elkhema-2024-2024-10-05-a-b/geo-watch-elkhema-2024-2024-10-05-a-b.gif), [dev notes](https://medium.com/@arash-kamangir/%EF%B8%8F-conversations-with-ai-251-a68fab7f52b8). diff --git a/blue_geo/watch/targets/__main__.py b/blue_geo/watch/targets/__main__.py index 6eeb470f..cb41d9f3 100644 --- a/blue_geo/watch/targets/__main__.py +++ b/blue_geo/watch/targets/__main__.py @@ -116,7 +116,10 @@ else: print(delim.join(output)) elif args.task == "save": - success = target.save(args.object_name) + if args.target_name == "all": + success = target_list.save(args.object_name) + else: + success = target.save(args.object_name) elif args.task == "test": success = target_list.test() else: diff --git a/blue_geo/watch/targets/classes.py b/blue_geo/watch/targets/classes.py index 821c516a..0b4ca52d 100644 --- a/blue_geo/watch/targets/classes.py +++ b/blue_geo/watch/targets/classes.py @@ -123,12 +123,39 @@ def one_liner(self) -> str: ), ) + @property + def polygon(self) -> Polygon: + lat = self.query_args.get("lat", 0) + lon = self.query_args.get("lon", 0) + width = self.params.get("width", 0.1) + height = self.params.get("height", 0.1) + + half_width = width / 2 + half_height = height / 2 + + top_left = (lon - half_width, lat + half_height) + top_right = (lon + half_width, lat + half_height) + bottom_right = (lon + half_width, lat - half_height) + bottom_left = (lon - half_width, lat - half_height) + + return Polygon( + [ + top_left, + top_right, + bottom_right, + bottom_left, + top_left, + ] + ) + def query_args_as_str(self, delim: str = " ") -> str: return delim.join( [f"--{argument} {value}" for argument, value in self.query_args.items()] ) def save(self, object_name: str) -> bool: + logger.info(f"saving target: {self.name} -> {object_name}") + if not file.save_yaml( objects.path_of( "target/metadata.yaml", @@ -139,26 +166,11 @@ def save(self, object_name: str) -> bool: ): return False - lat = self.query_args.get("lat", 0) - lon = self.query_args.get("lon", 0) - width = self.params.get("width", 0.1) - height = self.params.get("height", 0.1) - - half_width = width / 2 - half_height = height / 2 - - top_left = (lon - half_width, lat + half_height) - top_right = (lon + half_width, lat + half_height) - bottom_right = (lon + half_width, lat - half_height) - bottom_left = (lon - half_width, lat - half_height) - - polygon = Polygon([top_left, top_right, bottom_right, bottom_left, top_left]) - gdf = gpd.GeoDataFrame( { "id": ["1"], "description": [self.name], - "geometry": [polygon], + "geometry": [self.polygon], }, crs="EPSG:4326", ) @@ -280,6 +292,32 @@ def load( return True + def save(self, object_name: str) -> bool: + list_of_targets = self.get_list(including_versions=True) + + logger.info(f"saving {len(list_of_targets)} target(s): {object_name}") + + gdf = gpd.GeoDataFrame( + { + "id": [str(index + 1) for index in range(len(list_of_targets))], + "description": [ + self.get(target_name=target_name).name + for target_name in list_of_targets + ], + "geometry": [ + self.get(target_name=target_name).polygon + for target_name in list_of_targets + ], + }, + crs="EPSG:4326", + ) + + return file.save_geojson( + objects.path_of("target/shape.geojson", object_name), + gdf, + log=True, + ) + def test(self) -> bool: list_of_targets = self.get_list( including_versions=True, diff --git a/blue_geo/watch/template.md b/blue_geo/watch/template.md index 01fd636a..6aceefc0 100644 --- a/blue_geo/watch/template.md +++ b/blue_geo/watch/template.md @@ -7,7 +7,7 @@ watch the planet's story unfold. ``` --help-- blue_geo watch -🎯 [`geo-watch-targets/metadata.yaml`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-targets/metadata.yaml). +🎯 [`geo-watch-targets/metadata.yaml`](https://kamangir-public.s3.ca-central-1.amazonaws.com/geo-watch-targets/metadata.yaml): [geojson](./targets.geojson). ## example run From 508a6665c0b747241c4961d5fede4d55331a8776 Mon Sep 17 00:00:00 2001 From: kamangir Date: Mon, 7 Oct 2024 20:20:06 -0700 Subject: [PATCH 3/6] target refactors - kamangir/bolt#746 --- README.md | 2 +- blue_geo/__init__.py | 2 +- blue_geo/watch/README.md | 18 +++++++++--------- blue_geo/watch/targets.geojson | 25 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 blue_geo/watch/targets.geojson diff --git a/README.md b/README.md index 5dd10219..74c5d2ce 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ to use on [AWS SageMaker](https://aws.amazon.com/sagemaker/) replace ` Date: Mon, 7 Oct 2024 20:23:06 -0700 Subject: [PATCH 4/6] rebuild - kamangir/bolt#746 --- README.md | 2 +- blue_geo/.abcli/watch/targets.sh | 2 +- blue_geo/__init__.py | 2 +- blue_geo/watch/README.md | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 74c5d2ce..9a7e486e 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ to use on [AWS SageMaker](https://aws.amazon.com/sagemaker/) replace ` Date: Mon, 7 Oct 2024 20:27:46 -0700 Subject: [PATCH 5/6] target refactors - kamangir/bolt#746 --- README.md | 2 +- blue_geo/__init__.py | 2 +- blue_geo/watch/README.md | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 9a7e486e..037f9216 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ to use on [AWS SageMaker](https://aws.amazon.com/sagemaker/) replace ` Date: Mon, 7 Oct 2024 20:29:20 -0700 Subject: [PATCH 6/6] target refactors - kamangir/bolt#746 --- README.md | 2 +- blue_geo/__init__.py | 2 +- blue_geo/watch/README.md | 18 +++++++++--------- blue_geo/watch/targets.geojson | 4 ++-- blue_geo/watch/targets/Leonardo.md | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 037f9216..c9a61141 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ to use on [AWS SageMaker](https://aws.amazon.com/sagemaker/) replace `