@@ -49,7 +49,7 @@ def snap(A, B, tolerance):
4949
5050 If B contains Lines or MultiLineString, columns include:
5151 - link: closest Line in B to Point in A
52- - node: start or end node of Line in B that is closest to the snapped point
52+ - node: start or end node of Line in B that is closest to the snapped point (if B contains columns "start_node_name" and "end_node_name")
5353 - snap_distance: distance between Point A and snapped point
5454 - line_position: normalized distance of snapped point along Line in B from the start node (0.0) and end node (1.0)
5555 - geometry: GeoPandas Point object of the snapped point
@@ -126,9 +126,12 @@ def snap(A, B, tolerance):
126126 snapped_points = gpd .GeoDataFrame (data = closest ,geometry = snapped_points , crs = crs )
127127 # determine whether the snapped point is closer to the start or end node
128128 snapped_points ["line_position" ] = closest .geometry .project (snapped_points , normalized = True )
129- snapped_points .loc [snapped_points ["line_position" ]< 0.5 , "node" ] = closest ["start_node_name" ]
130- snapped_points .loc [snapped_points ["line_position" ]>= 0.5 , "node" ] = closest ["end_node_name" ]
131- snapped_points = snapped_points [["link" , "node" , "snap_distance" , "line_position" , "geometry" ]]
129+ if ("start_node_name" in closest .columns ) and ("end_node_name" in closest .columns ):
130+ snapped_points .loc [snapped_points ["line_position" ]< 0.5 , "node" ] = closest ["start_node_name" ]
131+ snapped_points .loc [snapped_points ["line_position" ]>= 0.5 , "node" ] = closest ["end_node_name" ]
132+ snapped_points = snapped_points [["link" , "node" , "snap_distance" , "line_position" , "geometry" ]]
133+ else :
134+ snapped_points = snapped_points [["link" , "snap_distance" , "line_position" , "geometry" ]]
132135 snapped_points .index .name = None
133136
134137 return snapped_points
0 commit comments