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

时间:2019-10-16 14:23:00

标签: 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("./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值。

1 个答案:

答案 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