如何从sf包geos_binary_pred生成的sgbp对象获取扁平化数据框
解决sf包中几何匹配与筛选的问题
准备示例数据
先构造一个带重复几何的sf对象,方便后续演示:
library(sf) # 创建示例点数据 points_df <- data.frame( id = 1:6, attr = c("X", "Y", "X", "Z", "Y", "X"), geometry = st_sfc( st_point(c(1, 2)), st_point(c(2, 1)), st_point(c(1, 2)), st_point(c(3, 3)), st_point(c(2, 1)), st_point(c(1, 2)) ) ) points_sf <- st_as_sf(points_df)
目标1:按相同几何分组并排序
方法1:利用st_equals生成分组ID
通过st_equals获取几何匹配关系,再为每个几何分配唯一组ID,最后排序:
# 生成相等几何的匹配列表(sgbp类型) eq_matches <- st_equals(points_sf) # 为每个几何分配组ID(取每组最小id作为组标识,避免重复分组) group_ids <- match(sapply(eq_matches, min), sapply(eq_matches, min)) # 添加组ID并排序 points_sf$group_id <- group_ids sorted_sf <- points_sf[order(points_sf$group_id, points_sf$id), ] # 查看结果 print(sorted_sf)
方法2:结合dplyr按几何字符分组(更简洁)
把几何转成字符串作为分组键,直接用dplyr分组排序:
library(dplyr) sorted_sf <- points_sf %>% mutate(geom_str = as.character(st_geometry(.))) %>% group_by(geom_str) %>% arrange(id, .by_group = TRUE) %>% ungroup()
目标2:筛选特定几何(如POINT (2 1))
方法1:用st_equals直接匹配
# 构造目标点(注意和原数据CRS保持一致) target_point <- st_sfc(st_point(c(2, 1)), crs = st_crs(points_sf)) # 筛选匹配的样本 filtered_sf <- points_sf[st_equals(points_sf, target_point)[[1]], ]
方法2:用st_filter(需更新sf版本)
如果之前出现no applicable method for 'st_filter'报错,说明你的sf版本过低,先更新包:
install.packages("sf")
更新后使用st_filter筛选:
filtered_sf <- st_filter(points_sf, target_point, .predicate = st_equals)
解决你遇到的其他问题
- sgbp/matrix难以操作:可以把sgbp转成数据框,方便查看匹配关系:
eq_groups_df <- data.frame( source_id = rep(1:nrow(points_sf), sapply(eq_matches, length)), matched_id = unlist(eq_matches) )
- st_intersection的origins字段处理:把origins拆分成单独列,就能对比重复点位的属性:
intersect_res <- st_intersection(points_sf, points_sf) # 拆分origins为两个索引列 intersect_res <- intersect_res %>% mutate(origin_a = origins[,1], origin_b = origins[,2]) %>% select(-origins)
内容的提问来源于stack exchange,提问作者Tenstu
相关产品推荐
相关产品推荐

