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

如何在Shiny应用中判断多边形是否自交并实现条件绘制

识别自交多边形并控制绘制逻辑

可以使用R的sf包来检测多边形是否自交,它提供了专业的空间拓扑检查工具,完美适配你的需求。

实现步骤

  • 安装并加载sf包:
    install.packages("sf")
    library(sf)
    
  • 将数据框格式的坐标转换为sf多边形对象,确保坐标按正确顺序组成闭合环;
  • 使用st_is_valid_reason()排查多边形无效的具体原因,精准判断是否为自交导致;
  • 加入警告逻辑,仅绘制非自交的有效多边形。

修改后的完整代码

library(sf)

# 切换测试两个示例多边形
# 非自交多边形
polygon <- data.frame(x_coord=c(1,2.5,7.5,6.75,4), y_coord=c(5,7,6.5,0.75,0.25))
# 自交多边形
# polygon <- data.frame(x_coord=c(1.5,2.5,7.5,5.5,4.5), y_coord=c(3,7,6.5,3,7.5))

# 转换为sf多边形对象
polygon_sf <- st_polygon(list(as.matrix(polygon))) %>% st_sfc() %>% st_sf()

# 检查是否为自交多边形
valid_reason <- st_is_valid_reason(polygon_sf)
not_intersect <- TRUE

if (grepl("Self-intersection", valid_reason)) {
  warning("该多边形存在自交,无法绘制!")
  not_intersect <- FALSE
}

if (not_intersect) {
  P <- ggplot2::ggplot(polygon, ggplot2::aes(x=x_coord, y=y_coord)) +
       ggplot2::geom_polygon(fill="#99CCFF", color="red", alpha=0.25, linewidth=1, linetype=2) +
       ggplot2::geom_point(color="red", size=1.5) +
       ggplot2::scale_x_continuous(limits = c(0, 10), breaks = seq(0,10)) +
       ggplot2::scale_y_continuous(limits = c(0, 10), breaks = seq(0,10)) +
       ggplot2::theme_light()
  grDevices::pdf(file="test.pdf", height=6, width=6)
  print(P)
  grDevices::dev.off()
}

代码说明

  • st_polygon(list(as.matrix(polygon))):将坐标数据转换为POLYGON几何类型,外层list用于兼容多环多边形(如带洞的多边形);
  • st_is_valid_reason():返回多边形无效的具体原因,通过grepl("Self-intersection", ...)精准捕获自交场景;
  • 自交时会抛出警告且不执行绘制逻辑,仅非自交多边形会生成对应的PDF文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:24:54