如何结合空间几何与时间属性对多边形列表进行子集筛选?
多边形空间与时间属性结合筛选问题
需求说明
需要基于两个条件对多边形列表进行子集筛选:
- 多边形是否与列表中其他多边形在空间上相交;
- 多边形的时间属性(如创建时间)。
示例场景:
有三个部分重叠的多边形a、b、c,创建时间分别为t=c(1, 3, 5):
a与b相交,b与c相交,a与c不相交。
筛选规则:仅保留只与更早时间的多边形相交的多边形。
a因与更晚时间的b相交,需排除;b因与更晚时间的c相交,需排除(它与更早的a相交不构成排除理由);c因仅与更早的b相交,需保留。
示例基础代码
library(sf) # 创建多边形顶点 vertices <- rbind(c(1, 1), c(8, 1), c(8, 8), c(1, 8), c(1, 1)) listOfSquares <- list(a = vertices - 4, b = vertices + 4, c = vertices) listOfSquares <- lapply(listOfSquares, function(x) st_sfc(st_polygon(list(x))) ) # 绘制多边形 plot(listOfSquares[[1]], xlim = c(-5, 15), ylim = c(-5, 15)) plot(listOfSquares[[2]], add = TRUE) plot(listOfSquares[[3]], add = TRUE) text(x=-2.5,y=4.75,"a, t=1") text(x=-2.5+4,y=4.75+4,"b, t=3") text(x=-2.5+8,y=4.75+8,"c, t=5") # 添加时间属性 listOfSquares[[1]]$time <- 1 listOfSquares[[2]]$time <- 3 listOfSquares[[3]]$time <- 5
实现思路与代码
核心逻辑是:对每个多边形,检查是否存在时间晚于它且与它相交的其他多边形,若存在则排除,否则保留。建议先将分散的多边形列表合并为单个sf对象,便于批量处理空间关系与属性。
完整实现代码
library(sf) # ---------------------- 基础数据准备 ---------------------- vertices <- rbind(c(1, 1), c(8, 1), c(8, 8), c(1, 8), c(1, 1)) listOfSquares <- list(a = vertices - 4, b = vertices + 4, c = vertices) listOfSquares <- lapply(listOfSquares, function(x) st_sfc(st_polygon(list(x))) ) # 合并为单个sf对象,添加ID和时间属性 polygons_sf <- do.call(rbind, lapply(names(listOfSquares), function(id) { sf_obj <- listOfSquares[[id]] sf_obj$id <- id sf_obj$time <- c(1,3,5)[match(id, c("a","b","c"))] return(sf_obj) })) # ---------------------- 筛选逻辑实现 ---------------------- # 逐个检查每个多边形是否符合保留条件 keep <- sapply(1:nrow(polygons_sf), function(i) { current_poly <- polygons_sf[i,] # 筛选出所有时间晚于当前多边形的其他多边形 later_polys <- polygons_sf[polygons_sf$time > current_poly$time,] # 没有晚于当前时间的多边形,直接保留 if(nrow(later_polys) == 0) return(TRUE) # 检查当前多边形是否与任何晚于它的多边形相交 has_later_intersection <- any(st_intersects(current_poly, later_polys, sparse = FALSE)) # 仅当不存在与晚时间多边形相交的情况时,保留当前多边形 return(!has_later_intersection) }) # 获取筛选结果 filtered_polygons <- polygons_sf[keep,] # 查看结果 print(filtered_polygons) # 绘制筛选后的多边形(仅保留c) plot(filtered_polygons, xlim = c(-5, 15), ylim = c(-5, 15), col = "green") text(x=-2.5+8,y=4.75+8,"c, t=5")
逻辑说明
- 合并sf对象:将列表中的多边形统一为
sf数据框,方便同时处理空间几何与属性信息; - 时间筛选:对每个多边形,先提取所有时间晚于它的其他多边形;
- 空间相交检查:使用
st_intersects判断当前多边形是否与晚时间多边形存在空间交集; - 条件判断:若存在与晚时间多边形的交集,则排除当前多边形,否则保留。
内容的提问来源于stack exchange,提问作者gregor-fausto
相关产品推荐
相关产品推荐

