From 69e969b024376c6fc6e3801496e96463d9cbaa10 Mon Sep 17 00:00:00 2001 From: Wang Boyu Date: Sat, 4 Mar 2023 19:55:20 -0500 Subject: [PATCH 1/3] fix WMSWebTile.to_dict() method --- mesa_geo/tile_layers.py | 2 +- tests/test_WMSWebTile.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/test_WMSWebTile.py diff --git a/mesa_geo/tile_layers.py b/mesa_geo/tile_layers.py index 833e14b0..aee27ffb 100644 --- a/mesa_geo/tile_layers.py +++ b/mesa_geo/tile_layers.py @@ -54,4 +54,4 @@ class WMSWebTile(RasterWebTile): The available options can be found at: https://leafletjs.com/reference.html#tilelayer-wms """ - kind = "wms_web_tile" + kind: str = "wms_web_tile" diff --git a/tests/test_WMSWebTile.py b/tests/test_WMSWebTile.py new file mode 100644 index 00000000..9cd7eb9f --- /dev/null +++ b/tests/test_WMSWebTile.py @@ -0,0 +1,40 @@ +import unittest + +import mesa_geo as mg + + +class TestWMSWebTile(unittest.TestCase): + def setUp(self) -> None: + self.map_tile_url = "https://gis.charttools.noaa.gov/arcgis/rest/services/MCS/NOAAChartDisplay/MapServer/exts/MaritimeChartService/WMSServer/" + + def test_to_dict(self): + map_tile = mg.WMSWebTile( + url=self.map_tile_url, + options={ + "layers": "0,1,2,3,4,5,6,7,8,9,10,11,12", + "version": "1.3.0", + "format": "image/png", + }, + ) + self.assertEqual( + map_tile.to_dict(), + { + "kind": "wms_web_tile", + "url": self.map_tile_url, + "options": { + "layers": "0,1,2,3,4,5,6,7,8,9,10,11,12", + "version": "1.3.0", + "format": "image/png", + }, + }, + ) + + map_tile = mg.WMSWebTile(url=self.map_tile_url) + self.assertEqual( + map_tile.to_dict(), + { + "kind": "wms_web_tile", + "url": self.map_tile_url, + "options": None, + }, + ) From fefe81727771ee8a68bd587c6ef19f83270c27bd Mon Sep 17 00:00:00 2001 From: Wang Boyu Date: Sat, 4 Mar 2023 21:16:58 -0500 Subject: [PATCH 2/3] ci: ruff: ignore N999 invalid module name --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index e562372b..dacadd08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ extend-ignore = [ "PGH004", # Use specific rule codes when using `noqa` TODO "B905", # `zip()` without an explicit `strict=` parameter "N802", # Function name should be lowercase + "N999", # Invalid module name ] extend-exclude = ["docs", "build"] # Hardcode to Python 3.8. From ea7f389005a54d924b5ea5552e8073193b0d8239 Mon Sep 17 00:00:00 2001 From: Wang Boyu Date: Sat, 4 Mar 2023 21:46:27 -0500 Subject: [PATCH 3/3] ci: ruff: fix PLW2901 `for` loop variable `layer` overwritten by assignment target --- .../visualization/modules/MapVisualization.py | 8 ++++-- tests/test_MapModule.py | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/mesa_geo/visualization/modules/MapVisualization.py b/mesa_geo/visualization/modules/MapVisualization.py index 8fc91029..eaa383c0 100644 --- a/mesa_geo/visualization/modules/MapVisualization.py +++ b/mesa_geo/visualization/modules/MapVisualization.py @@ -101,9 +101,13 @@ def _render_layers(self, model): for layer in model.space.layers: if isinstance(layer, RasterBase): if isinstance(layer, RasterLayer): - layer = layer.to_image(colormap=self.portrayal_method) + layer_to_render = layer.to_image( + colormap=self.portrayal_method + ).to_crs(self._crs) + else: + layer_to_render = layer.to_crs(self._crs) layers["rasters"].append( - image_to_url(layer.to_crs(self._crs).values.transpose([1, 2, 0])) + image_to_url(layer_to_render.values.transpose([1, 2, 0])) ) elif isinstance(layer, gpd.GeoDataFrame): layers["vectors"].append( diff --git a/tests/test_MapModule.py b/tests/test_MapModule.py index dac5b1e8..7d2c88cd 100644 --- a/tests/test_MapModule.py +++ b/tests/test_MapModule.py @@ -2,6 +2,7 @@ import uuid import mesa +import numpy as np import xyzservices.providers as xyz from shapely.geometry import LineString, Point, Polygon @@ -30,6 +31,10 @@ def setUp(self) -> None: self.agent_creator.create_agent(polygon, unique_id=uuid.uuid4().int) for polygon in self.polygons ] + self.raster_layer = mg.RasterLayer( + 1, 1, crs="epsg:4326", total_bounds=[0, 0, 1, 1] + ) + self.raster_layer.apply_raster(np.array([[[0]]])) def tearDown(self) -> None: pass @@ -216,3 +221,23 @@ def test_js_code(self): map_module.js_code, "elements.push(new MapModule((11.1, 22.2), 20, 500, 500, null, {'position': 'bottomleft', 'imperial': true}));", ) + + def test_render_raster_layers(self): + map_module = mg.visualization.MapModule( + portrayal_method=lambda x: (255, 255, 255, 0.5) + ) + self.model.space.add_layer(self.raster_layer) + self.model.space.add_layer( + self.raster_layer.to_image(colormap=lambda x: (0, 0, 0, 1)) + ) + self.assertDictEqual( + map_module.render(self.model).get("layers"), + { + "rasters": [ + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVR42mP4DwQACfsD/Wj6HMwAAAAASUVORK5CYII=", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgYGD4DwABBAEAgLvRWwAAAABJRU5ErkJggg==", + ], + "total_bounds": [[0.0, 0.0], [1.0, 1.0]], + "vectors": [], + }, + )