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

R中用st_sample对重叠多边形采样点并继承属性的方法

问题分析与解决

你的代码存在两个核心问题:

  • 循环遍历逻辑错误,for(i in used_buff_1k$unique_id[i])的写法无法正确遍历每个唯一多边形
  • 直接对整个图层执行st_sample,得到的是无属性的几何点,自然无法关联到对应多边形

修正方案

方法一:用lapply实现(更简洁)

遍历每个唯一多边形,采样后保留原属性,最后合并为完整的sf对象:

# 获取所有唯一的多边形ID
unique_ids <- unique(used_buff_1k$unique_id)

# 遍历每个ID,采样并继承属性
sampled_points <- lapply(unique_ids, function(id) {
  # 筛选当前ID对应的单个多边形
  target_poly <- used_buff_1k[used_buff_1k$unique_id == id, ]
  # 对该多边形随机采样5个点
  points <- st_sample(target_poly, size = 5, type = "random")
  # 将采样点转为带属性的sf对象,每个点继承原多边形的属性
  st_sf(target_poly[rep(1, 5), ], geometry = points)
})

# 合并所有采样点为一个sf对象
sampled_points <- do.call(rbind, sampled_points)

方法二:用for循环实现(更直观)

如果习惯用循环,正确的写法如下:

# 创建空列表存储结果
sampled_list <- list()
# 获取所有唯一多边形ID
unique_ids <- unique(used_buff_1k$unique_id)

# 遍历每个唯一ID
for(i in seq_along(unique_ids)) {
  current_id <- unique_ids[i]
  # 筛选对应多边形
  target_poly <- used_buff_1k[used_buff_1k$unique_id == current_id, ]
  # 采样5个点
  points <- st_sample(target_poly, size = 5, type = "random")
  # 转为带属性的sf对象并加入列表
  sampled_list[[i]] <- st_sf(target_poly[rep(1, 5), ], geometry = points)
}

# 合并所有采样点
sampled_points <- do.call(rbind, sampled_list)

关键说明

  • 每次仅针对单个多边形采样,确保每个多边形生成5个点
  • 通过st_sf将采样点与原多边形的属性绑定,每个采样点都会继承对应多边形的全部属性
  • 最终合并后的sampled_points是标准sf对象,可直接用于后续分析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:07:16