我的建议涉及在形状的边界框内抽取随机x和y坐标,然后检查抽取的点是否实际上在形状内。如果抽样点在形状内,则返回它,否则重复此过程直到找到形状内的点。对于抽样,我们可以使用均匀分布,使得形状中的所有点具有相同的抽样概率。以下是函数:
from shapely.geometry import Point
def random_point_in_shp(shp):
within = False
while not within:
x = np.random.uniform(shp.bounds[0], shp.bounds[2])
y = np.random.uniform(shp.bounds[1], shp.bounds[3])
within = shp.contains(Point(x, y))
return Point(x,y)
以下是如何将此函数应用于名为geo_df
的GeoDataFrame
以获取每个条目的5个随机点的示例:
for num in range(5):
geo_df['Point{}'.format(num)] = geo_df['geometry'].apply(random_point_in_shp)
可能有更有效的方法来实现这一点,但根据您的应用程序,该算法可能足够快。对于我的测试文件,其中包含大约2300个条目,为每个条目生成五个随机点在我的计算机上花费了约15秒钟。