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
相关产品推荐
相关产品推荐

