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

基于terra库移除SpatVector中重叠多边形的技术咨询

用terra处理SpatVector中的重叠多边形

需求说明

移除所有存在重叠区域的多边形(可选保留非重叠部分),仅使用terra库实现。


方法1:完全移除所有有重叠的多边形

只要多边形与任何其他多边形存在重叠(包括部分重叠、完全包含/被包含),就将其从SpatVector中移除。

代码实现

library(terra)

# 加载示例数据
coords1 <- matrix(c(0, 0, 4, 0, 4, 4, 0, 4, 0, 0), ncol = 2, byrow = TRUE)
coords2 <- matrix(c(2, 2, 6, 2, 6, 6, 2, 6, 2, 2), ncol = 2, byrow = TRUE)
poly1 <- vect(coords1, type = "polygons")
poly2 <- vect(coords2, type = "polygons")
spatvect <- rbind(poly1, poly2)
spatvect$ID <- c(1, 2)
spatvect$year <- c(2020, 2021)

# 检测所有重叠的多边形对
n <- nrow(spatvect)
# 生成所有不重复的多边形对(避免自身对比)
pairs <- expand.grid(1:n, 1:n)
pairs <- pairs[pairs$Var1 < pairs$Var2, ]

# 判断每对是否存在重叠(包含部分重叠、完全包含/被包含)
has_overlap <- apply(pairs, 1, function(idx) {
  p1 <- spatvect[idx[1], ]
  p2 <- spatvect[idx[2], ]
  relate(p1, p2, "overlaps") || relate(p1, p2, "contains") || relate(p1, p2, "within")
})

# 获取所有参与重叠的多边形ID
overlap_ids <- unique(c(pairs[has_overlap, "Var1"], pairs[has_overlap, "Var2"]))

# 移除重叠多边形
non_overlap_polys <- spatvect[-overlap_ids, ]

# 查看结果
plot(non_overlap_polys)

说明

  • 示例中两个多边形互相重叠,因此最终结果为空,符合“移除所有重叠多边形”的要求。
  • 使用relate函数快速判断拓扑关系,比直接计算交集更高效,适合大型数据集。

方法2:保留多边形的非重叠部分

如果需要保留每个多边形中不与其他多边形重叠的区域(而非完全移除多边形),可以使用erase函数裁剪重叠区域。

代码实现

library(terra)

# 加载示例数据(同方法1)
coords1 <- matrix(c(0, 0, 4, 0, 4, 4, 0, 4, 0, 0), ncol = 2, byrow = TRUE)
coords2 <- matrix(c(2, 2, 6, 2, 6, 6, 2, 6, 2, 2), ncol = 2, byrow = TRUE)
poly1 <- vect(coords1, type = "polygons")
poly2 <- vect(coords2, type = "polygons")
spatvect <- rbind(poly1, poly2)
spatvect$ID <- c(1, 2)
spatvect$year <- c(2020, 2021)

# 逐个处理每个多边形,移除与其他多边形重叠的区域
non_overlap_parts <- lapply(1:nrow(spatvect), function(i) {
  # 提取当前多边形之外的所有多边形并合并为一个整体
  others <- spatvect[-i, ]
  others_union <- union(others)
  # 从当前多边形中减去其他多边形的区域
  erase(spatvect[i, ], others_union)
})

# 合并所有非重叠部分
non_overlap_parts <- do.call(rbind, non_overlap_parts)

# 查看结果
plot(non_overlap_parts)

说明

  • 示例中最终会保留两个独立的小正方形:第一个多边形的左下角区域(0-2, 0-2),第二个多边形的右上角区域(4-6,4-6)。
  • 该方法保留了原多边形的属性信息,仅裁剪掉重叠区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:37:27