R语言使用linestrings闭合多边形并按面积筛选合格多边形的问题
解决方法
直接将LINESTRING转为多边形失败的核心原因是栅格生成的初始等值线多为非闭合的开口线段,且存在多段线拓扑不连续的问题,无法直接通过
st_cast()强制转为合法多边形。无需手动处理线闭合逻辑,直接调用st_contour()原生的多边形输出能力即可更稳妥实现需求。
完整实现代码
# 加载依赖包 library(stars) library(sf) library(ggplot2) library(dplyr) # 原有栅格预处理逻辑保持不变 tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif)[, 1:50, 1:50, 1] x = round(x/5) x[[1]] = ifelse(x[[1]]<15,1,2) # 1. 直接生成原生闭合等值多边形 poly_contour <- st_contour(x, na.rm = TRUE, contour_lines = FALSE, # 关闭线输出,直接返回闭合多边形 breaks = 1.5) %>% st_set_crs(32725) %>% # 匹配你的投影坐标系(单位为米,面积计算直接是平方米) st_make_valid() # 自动处理少量存在拓扑问题的多边形 # 2. 筛选面积大于900㎡的多边形 poly_filtered <- poly_contour %>% mutate(area = st_area(.)) %>% filter(units::drop_units(area) > 900) # 去除单位后做数值比较 # 3. 可选:提取筛选后多边形对应的闭合等值线 line_filtered <- poly_filtered %>% st_cast("MULTILINESTRING") %>% st_cast("LINESTRING") # 可视化验证结果 ggplot() + geom_stars(data = x, alpha = 0.6) + geom_sf(data = line_filtered, color = "red", linewidth = 1) + theme_bw() + theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = "none" )
关键步骤说明
- 无需手动处理线转多边形逻辑:
st_contour原生支持直接输出闭合等值多边形,避免了开口线转多边形的拓扑错误问题 - 面积计算适配性:你使用的EPSG:32725是米级投影坐标系,
st_area直接返回平方米单位的面积结果,无需额外单位转换 - 拓扑兼容性:增加
st_make_valid()处理少量因栅格边缘导致的拓扑无效多边形,避免筛选时出错
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

