@@ -346,57 +346,43 @@ def loop(
346
346
)
347
347
split_points .extend (splitters )
348
348
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 :
376
356
# NOTE: it is unclear to me what exactly should happen here. I believe that
377
357
# there will be cases when we may want to keep multiple dangles. Now keeping
378
358
# only one.
379
359
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" )
399
383
to_add .append (candidate )
384
+ else :
385
+ to_add .append (candidate )
400
386
401
387
return to_add
402
388
0 commit comments