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

如何从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)

解决你遇到的其他问题

  1. sgbp/matrix难以操作:可以把sgbp转成数据框,方便查看匹配关系:
eq_groups_df <- data.frame(
  source_id = rep(1:nrow(points_sf), sapply(eq_matches, length)),
  matched_id = unlist(eq_matches)
)
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:21