From 3b214e1f0ff5ac28cfe0662db14c9e5f7977b92e Mon Sep 17 00:00:00 2001 From: Sufyan Abbasi Date: Wed, 12 Jun 2024 01:37:33 +0000 Subject: [PATCH 1/4] Remove drawn features layer when geometries are cleared --- geemap/core.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/geemap/core.py b/geemap/core.py index 2cf8896e02..a19cd7e9c8 100644 --- a/geemap/core.py +++ b/geemap/core.py @@ -15,6 +15,8 @@ from . import map_widgets from . import toolbar +DRAWN_FEATURES_LAYER = "Drawn Features" + class DrawActions(enum.Enum): """Action types for the draw control. @@ -46,7 +48,8 @@ def __init__(self, host_map): """Initialize the draw control. Args: - host_map (geemap.Map): The geemap.Map instance to be linked with the draw control. + host_map (geemap.Map): The geemap.Map instance to be linked with + the draw control. """ self.host_map = host_map @@ -194,11 +197,15 @@ def _sync_geometries(self): def _redraw_layer(self): if self.host_map: self.host_map.add_layer( - self.collection, {"color": "blue"}, "Drawn Features", False, 0.5 - ) - self.layer = self.host_map.ee_layers.get("Drawn Features", {}).get( - "ee_layer", None + self.collection, + {"color": "blue"}, + DRAWN_FEATURES_LAYER, + False, + 0.5 ) + self.layer = self.host_map.ee_layers.get( + DRAWN_FEATURES_LAYER, {} + ).get("ee_layer", None) def _handle_geometry_created(self, geo_json): geometry = common.geojson_to_ee(geo_json, geodesic=False) @@ -263,6 +270,10 @@ def handle_draw(_, action, geo_json): self._handle_geometry_edited(geo_json) elif action == "deleted": self._handle_geometry_deleted(geo_json) + # Remove drawn features layer if there are no geometries. + if not self.count: + if DRAWN_FEATURES_LAYER in self.host_map.ee_layers: + self.host_map.remove_layer(DRAWN_FEATURES_LAYER) except Exception as e: self.reset(clear_draw_control=False) print("There was an error creating Earth Engine Feature.") From 7db985c1d31d3e411732172ab21fbd979bea0dac Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 01:55:05 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- geemap/core.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/geemap/core.py b/geemap/core.py index a19cd7e9c8..a49ede41e2 100644 --- a/geemap/core.py +++ b/geemap/core.py @@ -197,15 +197,11 @@ def _sync_geometries(self): def _redraw_layer(self): if self.host_map: self.host_map.add_layer( - self.collection, - {"color": "blue"}, - DRAWN_FEATURES_LAYER, - False, - 0.5 + self.collection, {"color": "blue"}, DRAWN_FEATURES_LAYER, False, 0.5 + ) + self.layer = self.host_map.ee_layers.get(DRAWN_FEATURES_LAYER, {}).get( + "ee_layer", None ) - self.layer = self.host_map.ee_layers.get( - DRAWN_FEATURES_LAYER, {} - ).get("ee_layer", None) def _handle_geometry_created(self, geo_json): geometry = common.geojson_to_ee(geo_json, geodesic=False) From 6dd9c2e14859d1a87c5cb47206d8fab1e65d7e3a Mon Sep 17 00:00:00 2001 From: Sufyan Abbasi Date: Wed, 12 Jun 2024 18:21:30 +0000 Subject: [PATCH 3/4] Rename to private variable --- geemap/core.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/geemap/core.py b/geemap/core.py index a49ede41e2..82f6508b6f 100644 --- a/geemap/core.py +++ b/geemap/core.py @@ -15,7 +15,7 @@ from . import map_widgets from . import toolbar -DRAWN_FEATURES_LAYER = "Drawn Features" +_DRAWN_FEATURES_LAYER = "Drawn Features" class DrawActions(enum.Enum): @@ -197,9 +197,9 @@ def _sync_geometries(self): def _redraw_layer(self): if self.host_map: self.host_map.add_layer( - self.collection, {"color": "blue"}, DRAWN_FEATURES_LAYER, False, 0.5 + self.collection, {"color": "blue"}, _DRAWN_FEATURES_LAYER, False, 0.5 ) - self.layer = self.host_map.ee_layers.get(DRAWN_FEATURES_LAYER, {}).get( + self.layer = self.host_map.ee_layers.get(_DRAWN_FEATURES_LAYER, {}).get( "ee_layer", None ) @@ -268,8 +268,8 @@ def handle_draw(_, action, geo_json): self._handle_geometry_deleted(geo_json) # Remove drawn features layer if there are no geometries. if not self.count: - if DRAWN_FEATURES_LAYER in self.host_map.ee_layers: - self.host_map.remove_layer(DRAWN_FEATURES_LAYER) + if _DRAWN_FEATURES_LAYER in self.host_map.ee_layers: + self.host_map.remove_layer(_DRAWN_FEATURES_LAYER) except Exception as e: self.reset(clear_draw_control=False) print("There was an error creating Earth Engine Feature.") From 9b7c052588f9133463291b9911ea4046316ca373 Mon Sep 17 00:00:00 2001 From: Sufyan Abbasi Date: Wed, 12 Jun 2024 23:13:26 +0000 Subject: [PATCH 4/4] Add unit tests for draw features layer removal --- geemap/core.py | 10 +++++----- tests/fake_map.py | 3 +++ tests/test_core.py | 10 ++++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/geemap/core.py b/geemap/core.py index 82f6508b6f..9f88b29081 100644 --- a/geemap/core.py +++ b/geemap/core.py @@ -231,7 +231,11 @@ def _handle_geometry_deleted(self, geo_json): if index >= 0: del self.geometries[index] del self.properties[index] - self._redraw_layer() + if self.count: + self._redraw_layer() + elif _DRAWN_FEATURES_LAYER in self.host_map.ee_layers: + # Remove drawn features layer if there are no geometries. + self.host_map.remove_layer(_DRAWN_FEATURES_LAYER) self._geometry_delete_dispatcher(self, geometry=geometry) @@ -266,10 +270,6 @@ def handle_draw(_, action, geo_json): self._handle_geometry_edited(geo_json) elif action == "deleted": self._handle_geometry_deleted(geo_json) - # Remove drawn features layer if there are no geometries. - if not self.count: - if _DRAWN_FEATURES_LAYER in self.host_map.ee_layers: - self.host_map.remove_layer(_DRAWN_FEATURES_LAYER) except Exception as e: self.reset(clear_draw_control=False) print("There was an error creating Earth Engine Feature.") diff --git a/tests/fake_map.py b/tests/fake_map.py index 5a30da3941..f829e516fa 100644 --- a/tests/fake_map.py +++ b/tests/fake_map.py @@ -84,7 +84,10 @@ def add(self, obj): pass def remove_layer(self, layer): + if isinstance(layer, str): + layer = self.ee_layers[layer]["ee_layer"] self.layers.remove(layer) + del self.ee_layers[layer.name] def get_layer_names(self): return [layer.name for layer in self.layers] diff --git a/tests/test_core.py b/tests/test_core.py index 3618615c7a..3e58b7dcc0 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -202,8 +202,8 @@ class TestAbstractDrawControl(unittest.TestCase): } def setUp(self): - map = fake_map.FakeMap() - self._draw_control = TestAbstractDrawControl.TestDrawControl(map) + self.map = fake_map.FakeMap() + self._draw_control = TestAbstractDrawControl.TestDrawControl(self.map) def tearDown(self): pass @@ -220,6 +220,7 @@ def test_initialization(self): self.assertEquals(self._draw_control.collection, fake_ee.FeatureCollection([])) self.assertIsNone(self._draw_control.last_feature) self.assertEquals(self._draw_control.count, 0) + self.assertFalse("Drawn Features" in self.map.ee_layers) def test_handles_creation(self): self._draw_control.create(self.geo_json) @@ -227,12 +228,15 @@ def test_handles_creation(self): self._draw_control.geometries, [fake_ee.Geometry(self.geo_json["geometry"])], ) + self.assertTrue("Drawn Features" in self.map.ee_layers) def test_handles_deletion(self): self._draw_control.create(self.geo_json) + self.assertTrue("Drawn Features" in self.map.ee_layers) self.assertEquals(len(self._draw_control.geometries), 1) self._draw_control.delete(0) self.assertEquals(len(self._draw_control.geometries), 0) + self.assertFalse("Drawn Features" in self.map.ee_layers) def test_handles_edit(self): self._draw_control.create(self.geo_json) @@ -292,6 +296,7 @@ def test_reset(self): self._draw_control.reset(clear_draw_control=True) self.assertEquals(len(self._draw_control.geometries), 0) self.assertEquals(len(self._draw_control.geo_jsons), 0) + self.assertFalse("Drawn Features" in self.map.ee_layers) self._draw_control.create(self.geo_json) self.assertEquals(len(self._draw_control.geometries), 1) @@ -300,6 +305,7 @@ def test_reset(self): self._draw_control.reset(clear_draw_control=False) self.assertEquals(len(self._draw_control.geometries), 0) self.assertEquals(len(self._draw_control.geo_jsons), 1) + self.assertFalse("Drawn Features" in self.map.ee_layers) def test_remove_geometry(self): self._draw_control.create(self.geo_json)