Skip to content

Commit ae7db23

Browse files
authored
docs/typs/(small) refactor – get_solution() (#130)
1 parent 43e1da6 commit ae7db23

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

sgeop/simplify.py

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -528,23 +528,37 @@ def get_type(edges, shared_edge):
528528
return "E"
529529

530530

531-
def get_solution(group, roads):
531+
def get_solution(group: gpd.GeoDataFrame, roads: gpd.GeoDataFrame) -> pd.Series:
532+
"""Determine the solution for paired planar artifacts.
533+
534+
Parameters
535+
----------
536+
group : geopandas.GeoDataFrame
537+
Dissolved group of connected planar artifacts.
538+
roads : geopandas.GeoDataFrame
539+
Road network data.
540+
541+
Returns
542+
-------
543+
pandas.Series
544+
The determined solution and edge to drop.
545+
"""
546+
547+
def _relate(loc: int) -> tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]:
548+
"""Isolate intersecting & covering road geometries."""
549+
_geom = group.geometry.iloc[loc]
550+
_roads = roads.iloc[roads.sindex.query(_geom, predicate="intersects")]
551+
_covers = _roads.iloc[_roads.sindex.query(_geom, predicate="covers")]
552+
return _roads, _covers
553+
532554
cluster_geom = group.union_all()
533555

534-
roads_a = roads.iloc[
535-
roads.sindex.query(group.geometry.iloc[0], predicate="intersects")
536-
]
537-
roads_b = roads.iloc[
538-
roads.sindex.query(group.geometry.iloc[1], predicate="intersects")
539-
]
540-
covers_a = roads_a.iloc[
541-
roads_a.sindex.query(group.geometry.iloc[0], predicate="covers")
542-
]
543-
covers_b = roads_b.iloc[
544-
roads_b.sindex.query(group.geometry.iloc[1], predicate="covers")
545-
]
546-
# find the road segment that is contained within the cluster geometry
556+
roads_a, covers_a = _relate(0)
557+
roads_b, covers_b = _relate(1)
558+
559+
# Find the road segment that is contained within the cluster geometry
547560
shared = roads.index[roads.sindex.query(cluster_geom, predicate="contains")]
561+
548562
if shared.empty or covers_a.empty or covers_b.empty:
549563
return pd.Series({"solution": "non_planar", "drop_id": None})
550564

@@ -555,19 +569,15 @@ def get_solution(group, roads):
555569
):
556570
return pd.Series({"solution": "drop_interline", "drop_id": shared})
557571

558-
seen_by_a = get_type(
559-
covers_a,
560-
shared,
561-
)
562-
seen_by_b = get_type(
563-
covers_b,
564-
shared,
565-
)
572+
seen_by_a = get_type(covers_a, shared)
573+
seen_by_b = get_type(covers_b, shared)
566574

567575
if seen_by_a == "C" and seen_by_b == "C":
568576
return pd.Series({"solution": "iterate", "drop_id": shared})
577+
569578
if seen_by_a == seen_by_b:
570579
return pd.Series({"solution": "drop_interline", "drop_id": shared})
580+
571581
return pd.Series({"solution": "skeleton", "drop_id": shared})
572582

573583

0 commit comments

Comments
 (0)