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

