如何统计相同ID对应缓冲区内同ID点要素的数量
统计同ID缓冲区内同ID点数量实现方案
以下方案默认buffer_gdf和point_gdf均为已配置正确空间坐标系的空间数据对象,核心逻辑为按ID分组匹配,避免全量空间计算提升效率,适配大批量数据场景
Python(GeoPandas + Pandas)实现
import geopandas as gpd import pandas as pd # 给缓冲区表初始化点数量统计列 buffer_gdf['point_count'] = 0 # 遍历所有唯一ID,仅匹配同ID的缓冲区和点做空间计算 for unique_id in buffer_gdf['ID'].unique(): # 筛选当前ID的子集 sub_buffer = buffer_gdf[buffer_gdf['ID'] == unique_id].copy() sub_point = point_gdf[point_gdf['ID'] == unique_id].copy() # 空间连接:筛选落在缓冲区内的点 sjoin_res = gpd.sjoin(sub_buffer, sub_point, predicate='contains', how='left') # 统计每个缓冲区对应点数量 count_res = sjoin_res.groupby(level=0).size() # 结果回写原缓冲区表 buffer_gdf.loc[count_res.index, 'point_count'] = count_res
如果需要点与缓冲区边界接触就算入,将predicate参数值改为intersects即可。
R(sf + dplyr)实现
library(sf) library(dplyr) buffer_gdf <- buffer_gdf %>% # 按ID分组处理 group_by(ID) %>% mutate( # 统计当前ID每个缓冲区包含的同ID点数量 point_count = lengths(st_contains( geometry, point_gdf %>% filter(ID == cur_group()$ID) %>% pull(geometry) )) ) %>% ungroup()
sf包内置空间索引优化,分组计算逻辑大幅降低不必要的跨ID空间匹配开销,适合处理十万级以上的点要素数据。
内容的提问来源于stack exchange,提问作者ZairaRosas
相关产品推荐
相关产品推荐

