'Generate points which lie on linestring in geopandas

Lets say that I have the following geodataframe:

import geopandas as gpd
from shapely.geometry import LineString

line = LineString([(2.2, 4.2), (7.2, -25.1), (9.26, -2.456)])
gdf = gpd.GeoDataFrame(index=[0], crs='epsg:4326', geometry=[line])

Now what I want to achieve is to generate, lets say, 100 points that randomly lie on this linestring given in gdf. And then create another geodataframe which only includes these points.

Is it possible?

Best



Solution 1:[1]

  • clearly a LineString has multiple straight line segments
  • generate points on each segment that are linearly spaced
  • randomly select some of the points generated along each segment
  • have visualised to make it clear using folium
import geopandas as gpd
from shapely.geometry import LineString, Point
import numpy as np

line = LineString([(2.2, 4.2), (7.2, -25.1), (9.26, -2.456)])
gdf = gpd.GeoDataFrame(index=[0], crs="epsg:4326", geometry=[line])

N_POINTS = 20
POINTS_PER_SEGMENT = 100
# generate points per segment and randomly select N of them
gdf2 = gpd.GeoDataFrame(
    geometry=np.random.choice(
        [
            Point(x, y)
            for p1, p2 in zip(line.coords, line.coords[1:]) # iterate through line segments
            for x, y in zip(
                np.linspace(p1[0], p2[0], POINTS_PER_SEGMENT),
                np.linspace(p1[1], p2[1], POINTS_PER_SEGMENT),
            )
        ],
        N_POINTS,
    ),
    crs="epsg:4386",
)

m = gdf.explore(color="red", height=300, width=500)
gdf2.explore(m=m)

enter image description here

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 Rob Raymond