gpt4 book ai didi

python - 在类内的多边形内创建随机点

转载 作者:行者123 更新时间:2023-12-01 00:27:51 24 4
gpt4 key购买 nike

我正在尝试使用在基于代理的模型中使用的类在多边形内创建单个点。

目前,我可以创建限制在多边形边界的随机点,但不能创建限制在多边形本身的点。我的代码目前似乎忽略了 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

这段代码给出了一个无限循环。预期的行为是在给定 bool True 值的情况下停止,并在给定 False 的情况下继续,直到得到 True 值。

最佳答案

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

from shapely.geometry import Point, Polygon
import random


bounds = [(0, 0), (1, 0), (1, 1), (0, 1)]


class Agent():
def __init__(self, bounds):
self.polygon = Polygon(bounds)

# implement your object wide dataframe here to which you can append

def add_random_point(self):
xmin, ymin, xmax, ymax = self.polygon.bounds
while True:
x = random.uniform(xmin, xmax)
y = random.uniform(ymin, ymax)

if Point(x, y).within(self.polygon):
# if this condition is true, add to a dataframe here

print(x, y)
break


obj = Agent(bounds)
obj.add_random_point()

关于python - 在类内的多边形内创建随机点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58415606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com