Given a set of points I would like to have the boundary given by the outtermost points of the set. For example: if I have 11 points, 10 being on the perimeter of a circle (each one at 2*pi/10 radians) and some in the center (or "inside" of the other set of points) corners of a given circle:
n_points_on_circle = 10
theta = np.linspace(0, 2 * np.pi, n_points_on_circle + 1, endpoint=True)
x = np.cos(theta)
y = np.sin(theta)
n_rand = 300
r_rand = .92 * np.sqrt(np.random.random(n_rand))
theta_rand = 2 * np.pi *np.random.random(n_rand)
x_rand = r_rand * np.cos(theta_rand)
y_rand = r_rand * np.sin(theta_rand)
plt.plot(x,y, marker='o')
plt.scatter(x_rand, y_rand, marker='o', c='r')
ax = plt.gca()
ax.set_aspect('equal')
Returns the following image
And making a geodataframe with it:
all_y = np.concatenate([y, y_rand])
all_x = np.concatenate([x, x_rand])
gdf = gpd.GeoDataFrame(data=dict(lat=all_y, lon=all_x, geometry=gpd.points_from_xy(all_x, all_y)))
gdf.plot()
we have the following:
So the question ends up being. Given a geodataframe like gdf, how can I recover the blue polygon shown in the first figure?
This seems so simple I can't believe I would need to work it out. I think there must be a method to do it automatically.