使用R语言sf包统计网格内点数并生成含该信息的Shapefile的技术问询
使用R语言sf包统计网格内点数并生成含该信息的Shapefile的技术问询
嗨,我来帮你搞定这个问题!你已经完成了韩国行政区网格和点数据的准备工作,接下来要统计每个网格内的点数并导出带该信息的Shapefile,其实用st_join配合聚合操作就能解决,大概率是之前的用法没到位,下面给你一步步的解决方案:
步骤1:关联点与网格
首先我们需要把每个点匹配到对应的网格里,这里要用st_join并指定join = st_contains(判断点是否被网格包含),这样每个点会关联到它所在的网格:
# 将点数据关联到对应的网格 grid_point_join <- st_join(grid, point, join = st_contains)
步骤2:统计每个网格的点数
关联完成后,我们按网格的几何形状分组,统计每组的行数(也就是该网格内的点数):
# 统计每个网格内的点数 grid_with_count <- grid_point_join %>% group_by(geometry) %>% summarise(point_count = n(), .groups = "drop")
步骤3:补全无点网格的计数
上面的统计会漏掉没有点的网格,我们需要把原始网格和统计结果做左连接,将空网格的点数设为0:
# 确保所有网格都被保留,无点网格计数为0 grid_final <- grid %>% left_join(grid_with_count, by = "geometry") %>% mutate(point_count = ifelse(is.na(point_count), 0, point_count))
步骤4:导出为Shapefile
最后用sf包的st_write函数导出带点数信息的Shapefile:
# 导出Shapefile,可自行修改路径和文件名 st_write(grid_final, "./grid_with_point_counts.shp", delete_layer = TRUE)
额外提示
- 确保你的sf包是最新版本,旧版本可能在空间连接或聚合操作上存在bug;
- 如果点数据存在重复或无效记录,建议先通过
distinct()或过滤条件清理数据再统计; - 若点刚好落在网格边界上,
st_contains可能不会匹配,这时可以换成st_intersects来处理边界点。
备注:内容来源于stack exchange,提问作者ChanToRe
相关产品推荐
相关产品推荐

