You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选指定距离外的面要素并计算其汇总统计量?

解决思路与代码示例

问题目标

计算与目标区县距离超过指定阈值的其他区县的汇总统计量(均值、求和等)。

方法1:基于dnearneigh的补集计算

既然你已经能用dnearneigh获取距离范围内的邻居,那么距离外的区县就是「所有区县(排除自身)」减去「距离范围内的邻居」。具体步骤:

  • 先获取当前年份所有区县的总索引列表
  • 对每个区县,从总索引中剔除自身和近邻,得到距离超阈值的区县索引
  • 复用你原有的lapply逻辑计算统计量
# 承接你原有的代码,在得到within_km_10之后:
n <- nrow(shp_centroid_3)
all_indices <- 1:n

# 生成距离超过10000米的区县索引(排除自身)
beyond_km_10 <- lapply(1:n, function(i) {
  # 去掉自身和距离5000-10000米的近邻
  setdiff(all_indices, c(i, within_km_10[[i]]))
})

# 计算距离外区县的汇总统计量(和你原有的统计量对应)
tourism_beyond10km_mean <- unlist(lapply(beyond_km_10, \(v){mean(shp_centroid_3$TOT_EXP[v], na.rm=TRUE)}))
tourism_beyond10km_sum <- unlist(lapply(beyond_km_10, \(v){sum(shp_centroid_3$TOT_EXP[v], na.rm=TRUE)}))
tourism_beyond10km_score <- unlist(lapply(beyond_km_10, \(v){mean(shp_centroid_3$Z_SCORE[v], na.rm=TRUE)}))
# 其他统计量同理复制即可

方法2:直接用sf的st_distance筛选

如果觉得补集逻辑绕,直接计算距离矩阵后筛选更直观:

# 计算所有区县质心间的距离矩阵(单位:米)
dist_matrix <- st_distance(shp_centroid_3, shp_centroid_3)

# 生成距离超过10000米的区县索引(排除自身)
beyond_km_10 <- lapply(1:n, function(i) {
  which(dist_matrix[i, ] > 10000 & dist_matrix[i, ] != 0)  # 排除自身距离(0)
})

# 同样计算统计量,代码和方法1一致
tourism_beyond10km_mean <- unlist(lapply(beyond_km_10, \(v){mean(shp_centroid_3$TOT_EXP[v], na.rm=TRUE)}))
# ...其他统计量

注意事项

  • 确保距离单位统一:dnearneigh和st_distance默认用坐标系的单位,你的代码里用的是米,所以阈值要对应(比如10000米=10公里)
  • 如果区县数量较多,st_distance生成的矩阵会占用较多内存,此时方法1更高效
  • 若需要排除自身,注意在筛选时去掉索引等于自身的项

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:13:13