我试图使用用于基于代理的模型中的类在多边形内创建单个点。
当前,我能够创建约束于多边形边界的随机点,但不能创建多边形本身。目前,我的代码似乎忽略了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
此代码给出一个无限循环。预期的行为是停止给定布尔值True,然后继续False直到True值。
答案 0 :(得分:2)
不要使用counter变量,而是在多边形内采样点时使用break语句。计数器变量在退出时始终为1,因此不会携带新信息。我不太熟悉Geopandas库,但是您可以使用Shapely实现解决方案,这是一个非常不错的库imo。通过这种程序结构,您的对象将变得更通用。
month number age name column1
0 1 'Pete Houston' 'Software Engineer' 92 NaN
1 2 'John Wick' 'Assassin' 95 NaN
2 3 'Bruce Wayne' 'Batman' 99 NaN
3 4 'Clark Kent' 'Superman' 95 NaN