From e5820825dfaba917842c90f09336dd8e5e2033db Mon Sep 17 00:00:00 2001 From: James Gaboardi Date: Sun, 20 Oct 2024 14:59:42 -0400 Subject: [PATCH 1/2] source sgeop.continuity.py() -- remove algo.common.py --- core/algorithms/__init__.py | 2 +- core/algorithms/common.py | 94 ------------------------------------- core/algorithms/simplify.py | 2 +- core/tests/test_common.py | 34 -------------- 4 files changed, 2 insertions(+), 130 deletions(-) delete mode 100644 core/algorithms/common.py delete mode 100644 core/tests/test_common.py diff --git a/core/algorithms/__init__.py b/core/algorithms/__init__.py index 55d15ec..69a9a06 100644 --- a/core/algorithms/__init__.py +++ b/core/algorithms/__init__.py @@ -1 +1 @@ -from . import common, simplify, triangles +from . import simplify, triangles diff --git a/core/algorithms/common.py b/core/algorithms/common.py deleted file mode 100644 index 3b79bf8..0000000 --- a/core/algorithms/common.py +++ /dev/null @@ -1,94 +0,0 @@ -import geopandas -import momepy - - -def continuity( - roads: geopandas.GeoDataFrame, angle_threshold: float = 120 -) -> geopandas.GeoDataFrame: - """Assign COINS-based information to roads. - - Parameters - ---------- - roads : geopandas.GeoDataFrame - Road network. - - Returns - ------- - geopandas.GeoDataFrame - The input ``roads`` with additional columns where the original - index may be reset (see ``dedup`` keyword argument). - """ - roads = roads.copy() - - # Measure continuity of street network - coins = momepy.COINS(roads, angle_threshold=angle_threshold, flow_mode=True) - - # Assing continuity group - group, end = coins.stroke_attribute(True) - roads["coins_group"] = group - roads["coins_end"] = end - - # Assign length of each continuity group and a number of segments within the group. - coins_grouped = roads.length.groupby(roads.coins_group) - roads["coins_len"] = coins_grouped.sum()[roads.coins_group].values - roads["coins_count"] = coins_grouped.size()[roads.coins_group].values - - return roads, coins - - -def get_stroke_info(artifacts, roads): - """Generate information about strokes within the artifacts - - Resulting lists can be assigned as columns to ``artifacts``. - - Parameters - ---------- - artifacts : GeoDataFrame | GeoSeries - Polygons representing the artifacts - roads : GeoDataFrame | GeoSeries - LineStrings representing the road network - - Returns - ------- - stroke_count : list - C_count : list - E_count : list - S_count : list - """ - strokes = [] - c_ = [] - e_ = [] - s_ = [] - for geom in artifacts.geometry: - singles = 0 - ends = 0 - edges = roads.iloc[roads.sindex.query(geom, predicate="covers")] - if ( # roundabout special case - edges.coins_group.nunique() == 1 - and edges.shape[0] == edges.coins_count.iloc[0] - ): - singles = 1 - mains = 0 - else: - all_ends = edges[edges.coins_end] - mains = edges[ - ~edges.coins_group.isin(all_ends.coins_group) - ].coins_group.nunique() - - visited = [] - for coins_count, group in zip( - all_ends.coins_count, all_ends.coins_group, strict=True - ): - if (group not in visited) and ( - coins_count == (edges.coins_group == group).sum() - ): - singles += 1 - visited.append(group) - elif group not in visited: - ends += 1 - # do not add to visited as they may be disjoint within the artifact - strokes.append(edges.coins_group.nunique()) - c_.append(mains) - e_.append(ends) - s_.append(singles) - return strokes, c_, e_, s_ diff --git a/core/algorithms/simplify.py b/core/algorithms/simplify.py index a4ccba4..6ab9108 100644 --- a/core/algorithms/simplify.py +++ b/core/algorithms/simplify.py @@ -7,6 +7,7 @@ import pandas as pd from libpysal import graph from scipy import sparse +from sgeop.continuity import continuity, get_stroke_info from .artifacts import ( get_artifacts, @@ -15,7 +16,6 @@ nx_gx_cluster, nx_gx_identical, ) -from .common import continuity, get_stroke_info from .nodes import ( _status, consolidate_nodes, diff --git a/core/tests/test_common.py b/core/tests/test_common.py deleted file mode 100644 index 4c59251..0000000 --- a/core/tests/test_common.py +++ /dev/null @@ -1,34 +0,0 @@ -import geopandas -import pandas - -import core - - -class TestContinuity: - def setup_method(self): - self.city = "Liège" - self.roads = core.utils.read_no_degree_2(self.city) - - def test_basic(self): - roads, _ = core.algorithms.common.continuity(self.roads) - - assert isinstance(roads, geopandas.GeoDataFrame) - assert roads.geom_type.unique()[0] == "LineString" - - assert roads.columns.tolist() == [ - "geometry", - "coins_group", - "coins_end", - "coins_len", - "coins_count", - ] - - known_counts_coins_end = pandas.DataFrame( - {"coins_end": [True, False], "count": [8570, 7984]} - ) - observed_counts_coins_end = ( - roads["coins_end"].value_counts().to_frame().reset_index() - ) - pandas.testing.assert_frame_equal( - known_counts_coins_end, observed_counts_coins_end - ) From d7274b0bf2ebbd296c440a84ddc0fd5024e309c6 Mon Sep 17 00:00:00 2001 From: James Gaboardi Date: Sun, 20 Oct 2024 15:07:59 -0400 Subject: [PATCH 2/2] update notebooks -- sourve sgeop.continuity --- notebooks/typology-multiples.ipynb | 3 ++- notebooks/typology-rectangles.ipynb | 5 +++-- notebooks/typology-triangles.ipynb | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/notebooks/typology-multiples.ipynb b/notebooks/typology-multiples.ipynb index 9383443..2a443db 100644 --- a/notebooks/typology-multiples.ipynb +++ b/notebooks/typology-multiples.ipynb @@ -33,6 +33,7 @@ "import shapely\n", "from libpysal import graph\n", "from scipy import sparse\n", + "from sgeop.continuity import continuity\n", "from sgeop.geometry import voronoi_skeleton\n", "\n", "from core import algorithms, utils" @@ -102,7 +103,7 @@ "outputs": [], "source": [ "# %%time\n", - "roads, coins = algorithms.common.continuity(roads)" + "roads, coins = continuity(roads)" ] }, { diff --git a/notebooks/typology-rectangles.ipynb b/notebooks/typology-rectangles.ipynb index bf16e92..7c174b7 100644 --- a/notebooks/typology-rectangles.ipynb +++ b/notebooks/typology-rectangles.ipynb @@ -28,9 +28,10 @@ "from libpysal import graph\n", "from scipy import sparse, spatial\n", "from sgeop import geometry\n", + "from sgeop.continuity import continuity\n", "from tqdm import tqdm\n", "\n", - "from core import algorithms, utils" + "from core import utils" ] }, { @@ -97,7 +98,7 @@ ], "source": [ "%%time\n", - "roads = algorithms.common.continuity(roads_clean)" + "roads = continuity(roads_clean)" ] }, { diff --git a/notebooks/typology-triangles.ipynb b/notebooks/typology-triangles.ipynb index bfa74b4..601bdf6 100644 --- a/notebooks/typology-triangles.ipynb +++ b/notebooks/typology-triangles.ipynb @@ -25,6 +25,7 @@ "from folium import plugins\n", "from libpysal import graph\n", "from scipy import sparse\n", + "from sgeop.continuity import continuity\n", "from sgeop.geometry import _is_within\n", "\n", "from core import algorithms, utils" @@ -112,7 +113,7 @@ "source": [ "%%time\n", "roads = roads[~roads.geometry.duplicated()].reset_index()\n", - "roads = algorithms.common.continuity(roads)" + "roads = continuity(roads)" ] }, {