在不同的多边形中生成随机坐标

Generate random coordinates in different polygons

我是 Python 的新手。 我想在一组多边形内生成随机坐标。

为了在一个多边形内生成随机坐标,我在 Stackoverflor 上找到了这段代码,它有效:

def polygon_random_points (poly, num_points):
    minx, miny, maxx, maxy = poly.bounds 
    while len(points) < num_points:
        random_point = Point([random.uniform(minx, maxx), random.uniform(miny, maxy)])
        if (random_point.within(poly)):
            points.append(random_point)
    return points

但现在我很难为我的所有多边形实现一个 for 循环。它们具有这种数据类型:geopandas.geoseries.GeoSeries。 Alle_Polygone

我试过这段代码:

for Standorte in Alle_Polygone:
    def Zufallskoordinaten (poly, Anzahl):
        min_x, min_y, max_x, max_y = poly.bounds
        while len(Punkte) < Anzahl:
            Zufallspunkt = Point([random.uniform(min_x, max_x), random.uniform(min_y, max_y)])
            if (Zufallspunkt.within(poly)):
                Punkte.append(Zufallspunkt)
        return Punkte
Punkte = Zufallskoordinaten(Alle_Polygone,3)

不幸的是,这会导致此 AttributeError:'list' 对象没有属性 'bounds'。

也许有人可以帮助我。

  • 你遍历你的多边形,但将所有多边形传递给函数,它接受一个多边形,而不是多边形列表。 Alle_Polygone 没有 .bounds,因为你得到错误,但是 Alle_Polygone 中的元素,即多边形,它们有。
  • 函数定义一次就够了,不用在循环里
  • 在循环内调用定义的函数(记住,python 是空格敏感的,制表符很重要)。

如果哪组点对应于哪个多边形很重要,则将返回的点存储在列表(结构化)中:

alle_Punkte = []
def polygon_random_points (poly, Anzahl):
    min_x, min_y, max_x, max_y = poly.bounds
    while len(Punkte) < Anzahl:
        Zufallspunkt = Point([random.uniform(min_x, max_x), random.uniform(min_y, max_y)])
        if (Zufallspunkt.within(poly)):
            Punkte.append(Zufallspunkt)
    return Punkte

for Standorte in Alle_Polygone:    
    Punkte = polygon_random_points(Standorte,3)
    alle_Punkte.append(Punkte)

或者,如果您打算定义一个接受一组多边形的函数,那么

def Zufallskoordinaten (Alle_Polygone_, Anzahl):
    Punkte = []
    for Standorte in Alle_Polygone_:
        min_x, min_y, max_x, max_y = Standorte.bounds
        i = 0  # number of points generated for this Standorte
        while i < Anzahl:
            Zufallspunkt = Point([random.uniform(min_x, max_x), random.uniform(min_y, max_y)])
            if (Zufallspunkt.within(Standorte)):
                Punkte.append(Zufallspunkt)
                i++
    return Punkte

alle_Punkte = Zufallskoordinaten (Alle_Polygone,3)

这两个都会在每个多边形内生成 Anzahl 点数。这是你想要的吗?还是总计 Anzahl 点数?

根据您找到代码的同一个 StackExchange 线程,存在一个函数 object.representative_point(),它:

Returns a cheaply computed point that is guaranteed to be within the geometric object.

为什么要重新发明轮子?无论 shapely 在幕后实施什么,都保证比无休止的循环更有效,直到您碰巧选择满足您标准的 n 点。

def get_random_points(polygon, num_points):
    return [polygon.representative_point() for _ in range(num_points)]

def main():
    all_polygons = [...]
    all_points = []
    points_per_polygon = 3
    for polyon in all_polygons:
        all_points.append(get_random_points(polygon, points_per_polygon))
    print(all_points)

main()