Skip to content

Commit 9b27a56

Browse files
authored
keep only a single dangle in a loop (#140)
1 parent 2ee9f3a commit 9b27a56

File tree

1 file changed

+32
-46
lines changed

1 file changed

+32
-46
lines changed

core/algorithms/simplify.py

Lines changed: 32 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -346,57 +346,43 @@ def loop(
346346
)
347347
split_points.extend(splitters)
348348

349-
possible_dangle = possible_dangle[shapely.disjoint(possible_dangle, dropped)]
350-
n_comps = graph.Graph.build_contiguity(
351-
gpd.GeoSeries(possible_dangle), rook=False
352-
).n_components
353-
if n_comps == 1:
354-
logger.debug("LOOP components 1")
355-
dangle_coins = momepy.COINS(
356-
gpd.GeoSeries(shapely.line_merge(possible_dangle)).explode(),
357-
flow_mode=True,
358-
).stroke_gdf()
359-
candidate = dangle_coins.loc[dangle_coins.length.idxmax()].geometry
360-
if candidate.intersects(snap_to.union_all().buffer(eps)) and (
361-
candidate.length > min_dangle_length
362-
):
363-
logger.debug("LOOP intersects and length > min_dangle_length")
364-
if not primes.empty:
365-
points = [
366-
shapely.get_point(candidate, 0),
367-
shapely.get_point(candidate, -1),
368-
]
369-
distances = shapely.distance(points, highest_hierarchy.union_all())
370-
if distances.max() > min_dangle_length:
371-
logger.debug("LOOP prime check passed")
372-
to_add.append(candidate)
373-
else:
374-
to_add.append(candidate)
375-
elif n_comps > 1:
349+
possible_dangle = gpd.GeoDataFrame(
350+
geometry=possible_dangle[shapely.disjoint(possible_dangle, dropped)]
351+
)
352+
comps = graph.Graph.build_contiguity(
353+
possible_dangle.difference(snap_to.union_all().buffer(eps)), rook=False
354+
)
355+
if comps.n_components > 1:
376356
# NOTE: it is unclear to me what exactly should happen here. I believe that
377357
# there will be cases when we may want to keep multiple dangles. Now keeping
378358
# only one.
379359
logger.debug("LOOP components many")
380-
dangle_coins = momepy.COINS(
381-
gpd.GeoSeries(shapely.line_merge(possible_dangle)).explode(),
382-
flow_mode=True,
383-
).stroke_gdf()
384-
candidate = dangle_coins.loc[dangle_coins.length.idxmax()].geometry
385-
if candidate.intersects(snap_to.union_all().buffer(eps)) and (
386-
candidate.length > min_dangle_length
387-
):
388-
logger.debug("LOOP intersects and length > min_dangle_length")
389-
if not primes.empty:
390-
points = [
391-
shapely.get_point(candidate, 0),
392-
shapely.get_point(candidate, -1),
393-
]
394-
distances = shapely.distance(points, highest_hierarchy.union_all())
395-
if distances.max() > min_dangle_length:
396-
logger.debug("LOOP prime check passed")
397-
to_add.append(candidate)
398-
else:
360+
comp_labels = comps.component_labels.values
361+
longest_component = possible_dangle.dissolve(
362+
comps.component_labels
363+
).length.idxmax()
364+
possible_dangle = possible_dangle[comp_labels == longest_component]
365+
366+
dangle_coins = momepy.COINS(
367+
possible_dangle,
368+
flow_mode=True,
369+
).stroke_gdf()
370+
candidate = dangle_coins.loc[dangle_coins.length.idxmax()].geometry
371+
if candidate.intersects(snap_to.union_all().buffer(eps)) and (
372+
candidate.length > min_dangle_length
373+
):
374+
logger.debug("LOOP intersects and length > min_dangle_length")
375+
if not primes.empty:
376+
points = [
377+
shapely.get_point(candidate, 0),
378+
shapely.get_point(candidate, -1),
379+
]
380+
distances = shapely.distance(points, highest_hierarchy.union_all())
381+
if distances.max() > min_dangle_length:
382+
logger.debug("LOOP prime check passed")
399383
to_add.append(candidate)
384+
else:
385+
to_add.append(candidate)
400386

401387
return to_add
402388

0 commit comments

Comments
 (0)