geopandas:在多边形内生成随机点

涉及到的方法:

  1. np.random.uniform(min_x, max_x):np.random.uniform() 方法用于生成指定范围内的随机数,这里用它生成随机的横坐标。
  2. Point(x, y):Point 是 shapely.geometry.point 模块中的类,用于表示一个点对象,我们使用它将随机生成的横纵坐标组合成一个点对象。
  3. polygon.contains(random_point):contains() 方法用于检查一个点是否位于多边形内,我们使用它来检查生成的随机点是否在指定的多边形内部。

代码:
如果你读取自己的shp文件,代码需要进行更改,我已经在代码中注释需要更改的内容!!!

'''自定义一个多边形,并在多边形内生成一个随机点'''
import numpy as np
import geopandas as gpd
from shapely.geometry import Point, Polygon

# 构建多边形
polygon = Polygon([(0,0),
                   (1,1),
                   (1,0)])

# 随机生成一个点
while True:
    # 生成随机坐标
    # 如果你读取了自己的shp文件,即数据格式为GeoDataFrame,这里需要修改代码:polygon.total_bounds
    min_x, min_y, max_x, max_y = polygon.bounds  
    random_point = Point(np.random.uniform(min_x, max_x), np.random.uniform(min_y, max_y))
    
    # 检查点是否在多边形内
    # 同理,这里也需要更改:polygon.contains(random_point).values[0]
    if polygon.contains(random_point):
        break


'''如果你想指定点的数量,我们可以定义一个函数'''
def generate_random_points(polygon, num_points):
    # 存储点
    random_points = []
    
    while len(random_points) < num_points:
        # 生成随机坐标
        min_x, min_y, max_x, max_y = polygon.bounds  # 注意根据你的多边形数据格式进行更改
        random_point = Point(np.random.uniform(min_x, max_x), np.random.uniform(min_y, max_y))

        # 检查点是否在多边形内
        if polygon.contains(random_point):  # 注意根据你的多边形数据格式进行更改
            random_points.append(random_point)
            
    # 将得到的点作为结果返回
    return random_points
points = generate_random_points(polygon, 10)


'''如果你要可视化,需进行格数据式转换'''
import matplotlib.pyplot as plt

# 分别创建一个包含point和polygon对象的GeoDataFrame
# 如果你的数据格式已经是GeoDataFrame下面三行代码就不需要了
gdf_polygon = gpd.GeoDataFrame(geometry=[polygon])
gdf_point = gpd.GeoDataFrame(geometry=[random_point])
gdf_points = gpd.GeoDataFrame(geometry=points)

# 创建画布
plt.figure(figsize=(8,4), dpi=100)

# 单点
ax = plt.subplot(1,2,1)
bg = gdf_polygon.plot(ax=ax, color='lightgray')
ax = gdf_point.plot(ax=bg, color='red', markersize=50)

# 多点
ax1 = plt.subplot(1,2,2)
bg = gdf_polygon.plot(ax=ax1, color='lightgray')
ax1 = gdf_points.plot(ax=bg, color='red', markersize=10)

# 显示地图
plt.show()

结果:
geopandas:在多边形内生成随机点_第1张图片

你可能感兴趣的:(geopandas,python)