Python:创建一个网格并计算每个网格单元中的点数

时间:2019-02-16 17:57:35

标签: python geospatial

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

“几何”列包含每个点的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

我将不胜感激!

0 个答案:

没有答案