R语言sf空间相交后关联独立数据框计数求和方法问询
点缓冲相交线要素的计数求和实现
你当前已经完成了相交线要素ID的提取,剩余步骤只需要完成ID与计数字段的匹配、按点分组求和,再将结果挂载为点要素的新列即可。
适配现有代码的实现
无需修改你已经写好的相交识别逻辑,只要新增匹配求和的步骤即可,可借助purrr包做列表遍历,不想额外装包用基础R的sapply也能实现:
# 加载必要依赖,已加载可跳过 library(sf) library(dplyr) library(purrr) # --- 你已有的代码段 开始 --- points # sf格式点数据 linear_features # sf格式线数据 counts # 存储线要素ID、对应计数值的独立数据框,与线数据共享ID体系 intersect_100 <- points %>% st_buffer(100) %>% st_intersects(linear_features) %>% lapply(function(n){linear_features$id[n]}) # --- 你已有的代码段 结束 --- # 新增列计算:遍历每个点对应的相交线ID,匹配计数值求和 points$total_counts <- map_dbl(intersect_100, function(current_ids) { # 从counts表中筛选匹配ID的计数值求和,无匹配/空值时返回0 sum(counts$count[counts$id %in% current_ids], na.rm = TRUE) })
代码说明:如果你的
counts表中计数字段名不是count,把counts$count替换为实际的计数字段名即可;na.rm = TRUE用于规避计数值存在缺失值时求和结果返回NA的问题。
可选:无中间变量的链式写法
如果不需要单独保存相交ID列表,可以把全流程整合进管道操作,减少中间变量:
points <- points %>% mutate( total_counts = st_buffer(geometry, 100) %>% st_intersects(linear_features) %>% map_dbl(function(line_idx) { match_ids <- linear_features$id[line_idx] sum(counts$count[counts$id %in% match_ids], na.rm = TRUE) }) )
注意事项
- 若求和结果异常(全为0/数值明显不对),先检查
linear_features$id和counts$id的类型是否一致(比如一侧是字符型ID、一侧是数值型ID会导致匹配完全失败),再检查点数据的坐标系单位:如果是经纬度地理坐标系,st_buffer(100)的单位是度而非米,需要先转换为单位为米的投影坐标系再做缓冲分析 - 若存在同一条线要素被多次匹配的情况,可在匹配前对ID去重:
match_ids <- unique(match_ids),避免重复计数 - 不想用purrr依赖的话可以把
map_dbl替换为基础R的sapply,实现逻辑完全一致
内容的提问来源于stack exchange,提问作者jjmorgan
相关产品推荐
相关产品推荐

