在多边形内部生成随机点

在特定的地理区域或形状内生成随机点。这种需求很少,但在上周恰好我需要,在网上的资料又比较少,所以现在对此总结一下。

在Python中,我们可以利用numpyshapely库来实现这一功能。

一、背景介绍

numpy是Python中用于处理大型多维数组和矩阵的库,而shapely则是一个用于处理几何对象的Python库,支持点、线、多边形等几何类型。

二、实现方法

为了实现在多边形内部生成随机点的功能,我们可以定义一个函数random_points_in_polygon,该函数接受一个多边形对象和要生成的随机点数量作为参数,并返回多边形内部的随机点列表。

  1. 函数定义
    • 首先,我们定义一个空列表points来存储生成的随机点。
    • 然后,我们获取多边形的边界坐标(最小x、最小y、最大x、最大y),这些坐标将用于限定随机点的生成范围。
    • 在一个循环中,我们不断生成随机点,直到生成的随机点数量达到指定的数量。
    • 对于每个随机点,我们使用Polygon.contains()方法检查它是否位于多边形内部。如果是,则将其添加到points列表中。
  2. 创建多边形
    • 使用给定的顶点坐标创建一个Polygon对象。
  3. 调用函数并输出结果
    • 调用random_points_in_polygon函数,传入多边形和要生成的随机点数量。
    • 打印生成的随机点。

三、代码实现

以下是完整的代码实现:

import numpy as np
from shapely.geometry import Polygon
from shapely.geometry.point import Point



# 定义函数
def random_points_in_polygon(polygon, number):
    points = []
    minx, miny, maxx, maxy = polygon.bounds
    while len(points) < number:
        pnt = Point(np.random.uniform(minx, maxx), np.random.uniform(miny, maxy))
        if polygon.contains(pnt):
            points.append(pnt)
    return points

# 定义一个多边形的顶点坐标
polygon_vertices = [(0, 0), (1, 0), (1, 1), (0, 1)]
# 创建多边形对象
polygon = Polygon(polygon_vertices)

# 定义要生成的随机点的数量
number_of_points = 10

# 调用函数并获取结果
random_points = random_points_in_polygon(polygon, number_of_points)

# 打印结果
for point in random_points:
    print(point)

image-20240521161807547

四、代码实现

  • random_points_in_polygon(polygon, number):该函数生成 number 个位于 polygon 内的随机点。
  • points:用于存储生成的随机点。
  • minx, miny, maxx, maxy:多边形的边界框,用于确定生成随机点的范围。
  • while len(points) < number:循环生成点,直到数量达到 number
  • np.random.uniform(minx, maxx)np.random.uniform(miny, maxy):生成在多边形边界框内的随机坐标。
  • Point():创建一个点对象。
  • polygon.contains(pnt):检查点是否在多边形内。
  • points.append(pnt):如果点在多边形内,则将其添加到 points 列表中。
  • return points:返回生成的随机点列表。

这次就不打包为exe文件了,因为这个需求应该很少的,俺只是在写代码的时候,恰好遇到问题,也恰好有了这个需求。

以后的代码分析,如果需求大,就尽量打包为exe,方便大家。如果内容方向比较冷门,则只是单纯地作为技术分享。