Python 在类中的多边形内创建随机点

Python 在类中的多边形内创建随机点,python,class,gis,polygon,point,Python,Class,Gis,Polygon,Point,我正在尝试使用一个类在多边形中创建一个点,以便在基于代理的模型中使用 目前,我可以创建约束到多边形边界的随机点,但不能创建多边形本身。我的代码目前似乎忽略了while循环中的if语句。我对python非常陌生,所以这可能是我缺少的一个限制 这是我目前的代码: import geopandas as gpd import matplotlib.pyplot as plt import random import pandas as pd bounds = gpd.read_file("./dat

我正在尝试使用一个类在多边形中创建一个点,以便在基于代理的模型中使用

目前,我可以创建约束到多边形边界的随机点,但不能创建多边形本身。我的代码目前似乎忽略了while循环中的if语句。我对python非常陌生,所以这可能是我缺少的一个限制

这是我目前的代码:

import geopandas as gpd
import matplotlib.pyplot as plt
import random
import pandas as pd

bounds = gpd.read_file("./data/liverpool_bounds.gpkg")


class Agent():
    def __init__(self, bounds):
        x_min, y_min, x_max, y_max = bounds.total_bounds

        counter = 0
        while counter != 1:
            x = random.uniform(x_min, x_max)
            y = random.uniform(y_min, y_max)
            df = pd.DataFrame({'x': [x], 'y': [y]})
            self.agent = gpd.GeoDataFrame(
                df, geometry=gpd.points_from_xy(df.x, df.y))

            if self.agent.within(bounds) is True:
                counter = 1

            # counter does not increase
            print(counter)
            # gives both True and False
            print(self.agent.within(bounds))


Agent(bounds).agent

这段代码给出了一个无限循环。预期的行为是在给定布尔真值时停止,并继续使用False,直到得到真值。

不要使用计数器变量,而是在多边形内对点进行采样时使用break语句。计数器变量在退出时始终为1,因此不会携带新信息。我对Geopandas库不是很熟悉,但是你可以用它来实现一个解决方案,这在我看来是一个非常好的库。有了这个程序结构,你的对象变得更普遍可用

从shapely.geometry导入点,多边形
随机输入
边界=[(0,0)、(1,0)、(1,1)、(0,1)]
类代理():
定义初始(自,边界):
self.polygon=多边形(边界)
#在这里实现您可以附加到的对象范围的数据帧
def添加随机点(自身):
xmin,ymin,xmax,ymax=self.polygon.bounds
尽管如此:
x=随机均匀(xmin,xmax)
y=随机均匀(ymin,ymax)
如果点(x,y).在(自多边形)内:
#如果此条件为真,请在此处添加到数据帧
打印(x,y)
打破
obj=代理(边界)
对象添加随机点()

您好,谢谢您的回复。这似乎不起作用,但是,我仍然得到一个无限循环,其中包含
self.agent.within(bounds)
True
False
self.agent.within()的返回值是一个geopandas.Series对象,但您需要在此条件中输入一个原子值才能通过。@CillianBerragan此更新可能会解决您的问题。感谢更新,我个人希望在我的应用程序中使用geopandas,但您关于inthein()输出的建议给出了解决方案。我基本上只需要转换成一个布尔值,if循环才能工作
within=int(gdf.within(self.bounds)
可能不是最好的方法,但它可以工作。更好的是:
gdf.within(self.bounds)[0]
可以作为布尔值工作。