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

如何结合空间几何与时间属性对多边形列表进行子集筛选?

多边形空间与时间属性结合筛选问题

需求说明

需要基于两个条件对多边形列表进行子集筛选:

  • 多边形是否与列表中其他多边形在空间上相交;
  • 多边形的时间属性(如创建时间)。

示例场景:
有三个部分重叠的多边形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")

逻辑说明

  1. 合并sf对象:将列表中的多边形统一为sf数据框,方便同时处理空间几何与属性信息;
  2. 时间筛选:对每个多边形,先提取所有时间晚于它的其他多边形;
  3. 空间相交检查:使用st_intersects判断当前多边形是否与晚时间多边形存在空间交集;
  4. 条件判断:若存在与晚时间多边形的交集,则排除当前多边形,否则保留。

内容的提问来源于stack exchange,提问作者gregor-fausto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:31:14