У меня есть геоданные с двумя столбцами: геометрия и категория.
Столбец геометрии содержит координаты 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
Буду признателен за любую помощь или идеи!