首页 > 解决方案 > Python:创建一个网格并计算每个网格单元格中的点数

问题描述

我有一个包含两列的地理数据框:几何和类别。

几何列包含每个点的 x 和 y 坐标,类别列包含每个点的分类值。

我正在尝试创建一个网格,然后使用 Python 计算每个网格单元内的点数。最终目标是创建网格单元中计数的基本直方图(例如 plt.hist())。

到目前为止,我有以下代码,但是,当我运行代码时,它似乎只是挂起......或者它真的非常低效。

我要使用的网格单元是 1000 m x 1000 m(因此每个单元中心的 +500 和 -500)。

有谁知道如何网格化然后计算每个网格单元中的点数?

points_df.head()
Out[1]: 
  category    geometry
0   cat       POINT (476755.37 173256.16)
1   cat       POINT (459671.16 268477.14)
2   cat       POINT (516320.74 200363.71)
3   cat       POINT (505964.05 202886.12)
4   cat       POINT (442114.96 290854.97)


    #calculate grid cell centers
    x_cen = np.linspace(500, 659500, 660)
    y_cen = np.linspace(500, 1059500, 1060)

    cell_centers = []
    for x in x_cen:
        for y in y_cen:
            cell_centers.append({'center': (x, y)})

    #create dataframe of cell centers
    grid_df = pd.DataFrame(cell_centers)

    #create an empty column to hold the counts per cell 
    grid_df['counts'] = [0 for n in range(len(grid_df))]

    #count the number of points that fall within each grid cell
    for index1, row1 in grid_df.iterrows():
        for index2, row2 in points_df.iterrows():
            if row2.geometry.centroid.x > row1.center[0] - 500 and row2.geometry.centroid.x < row1.center[0] + 500 and row2.geometry.centroid.y > row1.center[1] - 500 and row2.geometry.centroid.y < row1.center[1] + 500:
                if row2.category == 'cat':
                    row1.counts += 1

我将不胜感激任何帮助或想法!

标签: pythongeospatial

解决方案


推荐阅读