Python: создать сетку и подсчитать количество точек в каждой ячейке сетки - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть геоданные с двумя столбцами: геометрия и категория.

Столбец геометрии содержит координаты x и y для каждой точки, а столбец категории содержит категориальное значение для каждой точки.

Я пытаюсь создать сетку, а затем подсчитать количество точек, которые попадают в каждую ячейку сетки, используя Python.Конечная цель - создать базовую гистограмму (например, plt.hist ()) счетчиков в ячейках сетки.

Однако до сих пор у меня есть следующий код, однако, когда я запускаю код, он выглядит простозависать ... или это действительно очень неэффективно.

Ячейки сетки, которые я хочу использовать, имеют размер 1000 м на 1000 м (следовательно, +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

Буду признателен за любую помощь или идеи!

...