From fa8153020f545c69a5358879ab80ad6fd8025ca8 Mon Sep 17 00:00:00 2001 From: Taro Matsuzawa Date: Tue, 13 Jun 2023 05:12:41 +0900 Subject: [PATCH] fixes #4 create cli interface for meshcode_to_polygon --- plateauutils/cli.py | 13 +++++++++++++ plateauutils/mesh_geocorder/geo_to_mesh.py | 2 ++ .../mesh_geocorder/tests/test_geo_to_mesh.py | 4 ++++ plateauutils/tests/test_cli.py | 19 ++++++++++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/plateauutils/cli.py b/plateauutils/cli.py index f769416..76137ff 100644 --- a/plateauutils/cli.py +++ b/plateauutils/cli.py @@ -8,7 +8,9 @@ from shapely.geometry import Point from plateauutils.mesh_geocorder.geo_to_mesh import ( point_to_meshcode as _point_to_meshcode, + meshcode_to_polygon as _meshcode_to_polygon, MeshException, + MeshCodeException, ) @@ -37,6 +39,17 @@ def point_to_meshcode(longitude, latitude, mesh): click.echo("Error: {}".format(e)) +@mesh_geocorder.command() +@click.argument("meshcode", required=True, type=str) +def meshcode_to_polygon(meshcode): + """Convert a meshcode to a polygon""" + try: + polygon = _meshcode_to_polygon(meshcode) + click.echo(polygon.wkt) + except MeshCodeException as e: + click.echo("Error: {}".format(e)) + + def main(): cli() diff --git a/plateauutils/mesh_geocorder/geo_to_mesh.py b/plateauutils/mesh_geocorder/geo_to_mesh.py index 625efe5..948547e 100644 --- a/plateauutils/mesh_geocorder/geo_to_mesh.py +++ b/plateauutils/mesh_geocorder/geo_to_mesh.py @@ -97,6 +97,8 @@ def meshcode_to_polygon(mesh_code: str) -> Polygon: raise MeshCodeException("Mesh code must be 4 or more digits") if len(mesh_code) > 10: raise MeshCodeException("Mesh code must be 10 or less digits") + if len(mesh_code) not in [4, 6, 8, 9, 10]: + raise MeshCodeException("Mesh code must be 4, 6, 8, 9 or 10 digits") left_x = 0 right_x = 0 diff --git a/plateauutils/mesh_geocorder/tests/test_geo_to_mesh.py b/plateauutils/mesh_geocorder/tests/test_geo_to_mesh.py index 7d57285..2bdd861 100644 --- a/plateauutils/mesh_geocorder/tests/test_geo_to_mesh.py +++ b/plateauutils/mesh_geocorder/tests/test_geo_to_mesh.py @@ -55,6 +55,10 @@ def test_invalid_mesh_code_to_polygon(): meshcode_to_polygon("5339454715") assert str(e.value) == "4th mesh must be 1 to 4" + with pytest.raises(MeshCodeException) as e: + meshcode_to_polygon("55394") + assert str(e.value) == "Mesh code must be 4, 6, 8, 9 or 10 digits" + def test_meshcode_to_polygon(): """メッシュコードからポリゴンを生成するテスト""" diff --git a/plateauutils/tests/test_cli.py b/plateauutils/tests/test_cli.py index 53966ab..691a6e3 100644 --- a/plateauutils/tests/test_cli.py +++ b/plateauutils/tests/test_cli.py @@ -1,5 +1,5 @@ from click.testing import CliRunner -from plateauutils.cli import point_to_meshcode +from plateauutils.cli import point_to_meshcode, meshcode_to_polygon def test_point_to_meshcode(): @@ -14,3 +14,20 @@ def test_invalid_point_to_meshcode(): result = runner.invoke(point_to_meshcode, ["139.71475", "35.70078", "5/1"]) assert result.exit_code == 0 assert result.output == "Error: Mesh must be one of 1, 2, 2/1, 3, 4/1\n" + + +def test_meshcode_to_polygon(): + runner = CliRunner() + result = runner.invoke(meshcode_to_polygon, ["533945"]) + assert result.exit_code == 0 + assert ( + result.output + == "POLYGON ((139.625 35.66666666666667, 139.75 35.66666666666667, 139.75 35.75000000000001, 139.625 35.75000000000001, 139.625 35.66666666666667))\n" + ) + + +def test_invalid_meshcode_to_polygon(): + runner = CliRunner() + result = runner.invoke(meshcode_to_polygon, ["53394547141"]) + assert result.exit_code == 0 + assert result.output == "Error: Mesh code must be 10 or less digits\n"