@@ -528,23 +528,37 @@ def get_type(edges, shared_edge):
528
528
return "E"
529
529
530
530
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
+
532
554
cluster_geom = group .union_all ()
533
555
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
547
560
shared = roads .index [roads .sindex .query (cluster_geom , predicate = "contains" )]
561
+
548
562
if shared .empty or covers_a .empty or covers_b .empty :
549
563
return pd .Series ({"solution" : "non_planar" , "drop_id" : None })
550
564
@@ -555,19 +569,15 @@ def get_solution(group, roads):
555
569
):
556
570
return pd .Series ({"solution" : "drop_interline" , "drop_id" : shared })
557
571
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 )
566
574
567
575
if seen_by_a == "C" and seen_by_b == "C" :
568
576
return pd .Series ({"solution" : "iterate" , "drop_id" : shared })
577
+
569
578
if seen_by_a == seen_by_b :
570
579
return pd .Series ({"solution" : "drop_interline" , "drop_id" : shared })
580
+
571
581
return pd .Series ({"solution" : "skeleton" , "drop_id" : shared })
572
582
573
583
0 commit comments