如何在Terra的SpatVector中查找重复几何图形?
查找Terra中SpatVector的重复几何图形
问题背景
在处理全球几何数据库时,存在部分重复的几何图形,这些图形的非几何属性列可能相同或不同(比如同一图形属于两个管辖机构,会出现两次且机构列不同)。作为Terra新手,尝试用类似sf的group_by(SHAPE)方法统计重复次数,但发现Terra的SpatVector无法直接访问SHAPE列进行分组。
可复现代码:
library(terra) library(dplyr) library(ggplot2) library(tidyterra) f <- system.file("ex/lux.shp", package="terra") v <- vect(f) v2 <- v %>% slice(1) %>% mutate(NAME_1 = "Diekirch1", NAME_2 = "Some other name") # 手动复制一行并修改非几何列 v3 <- rbind(v, v2) # 可视化重复图形 ggplot() + geom_spatvector(data = v3, fill = "purple", alpha = .5)
解决方案
方法1:直接标记重复几何
Terra内置了duplicatedGeom()函数,可直接识别重复的几何图形,返回逻辑向量标记哪些行是重复项:
# 给SpatVector添加重复标记列 v3$is_duplicate <- duplicatedGeom(v3, method = "equivalent") # 查看所有重复的行 v3[v3$is_duplicate, ]
method = "equivalent":忽略顶点顺序、方向,只要几何形状完全一致即判定为重复(更符合实际需求);若选"identical"则要求顶点顺序和方向也完全相同。
方法2:统计每个几何的重复次数
如果需要统计每个几何的出现次数,可以结合geom_hash()生成几何的唯一哈希值(相同几何的哈希值一致),再进行分组统计:
# 生成几何哈希列 v3$geom_hash <- geom_hash(v3, method = "equivalent") # 用dplyr统计重复次数并合并回原数据 v3_with_count <- v3 %>% as_tibble() %>% group_by(geom_hash) %>% add_count(name = "repeat_count") %>% right_join(v3, ., by = c(names(v3), "geom_hash")) # 查看结果,repeat_count列即为对应几何的出现次数 head(v3_with_count)
或者用基础R的table()函数更简洁:
# 统计每个哈希值的出现次数 geom_counts <- table(geom_hash(v3, method = "equivalent")) # 将计数匹配到原SpatVector v3$repeat_count <- geom_counts[geom_hash(v3, method = "equivalent")]
内容的提问来源于stack exchange,提问作者Jake L
相关产品推荐
相关产品推荐

