Python 在类中的多边形内创建随机点
我正在尝试使用一个类在多边形中创建一个点,以便在基于代理的模型中使用 目前,我可以创建约束到多边形边界的随机点,但不能创建多边形本身。我的代码目前似乎忽略了while循环中的if语句。我对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
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]
可以作为布尔值工作。