如何在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
相关产品推荐
相关产品推荐

