'Geopandas: How to relate the length of a linestring to the linestring point used to find distance to polygon

I’m trying to find the length of the linestring between the starting point of the linestring and the point which are used to find the nearest distance to a polygon.

So I used the following code to get the minimum distance between the linestring and some polygons.

gdf['MinDistToTrack'] = gdf.geometry.apply(lambda l: min(rail_or.distance(l)))

and I would also like to get the distance from the start of the linestring to the point used by the above code.

Now I get dataframe containing the polygons with a value 'MinDistToTrack' (which I have now) but also with a value ‘Length_Of_Linestring_Up_To_Location_Of_Polygon’.

So, let’s say that from the start of the linestring to the polygon there are 22 meters following the path of the linestring, then this is the value I would like to save together with the 'MinDistToTrack'

Polygon ID : 1 'MinDistToTrack' : 1m 'LengthOfLinestringUpToLocationOfPolygon' : 22m

Is this possible or do I need to split the linestring up into small elements and then look at all elements and the length of all the preceding elements in relation to the linestring elements which is nearest to the polygon?

Picture showing the problem



Solution 1:[1]

You may use the following concepts from shapely:

  1. The nearest_points() function in shapely.ops calculates the nearest points in a pair of geometries.

shapely.ops.nearest_points(geom1, geom2) Returns a tuple of the nearest points in the input geometries. The points are returned in the same order as the input geometries.

https://shapely.readthedocs.io/en/stable/manual.html#shapely.ops.nearest_points

from shapely.ops import nearest_points
P = Polygon([(0, 0), (1, 0), (0.5, 1), (0, 0)])
Lin = Linestring([(0, 2), (1, 2), (1, 3), (0, 3)])
nps = [o.wkt for o in nearest_points(P, Lin)]
##nps = ['POINT (0.5 1)', 'POINT (0.5 2)']
np_lin = = nps[1]
  1. You can then use the point np_lin and Project it on the Lin to get the distance using

d = Lin.project(np_lin) d will be the distance along Lin to the point np_lin i.e. nearest to the corresponding Point of P.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Subhrasankha Dey