使用R语言sf包从渔网/网格(线要素)生成面要素
从线要素网格生成独立面单元(替代ESRI Feature to Polygon)
嗨,我看到你想把那些构成网格的线要素转换成一个个独立无重叠的面单元,还得处理偶尔偏移的不规整网格——其实不用手动去构建每个多边形的坐标,sf包里就有完美对应ESRI Feature to Polygon的功能,几步就能搞定,效率还高。
具体实现步骤
1. 合并所有线要素
首先需要把分散的线合并成一个完整的线网络,这样后续的多边形化才能准确识别出所有闭合区域:
merged_lines <- st_union(lines_sf)
2. 自动多边形化
st_polygonize()函数就是干这个活的,它会自动识别线网络里的所有闭合区域,直接转换成面要素:
polygons_sf_auto <- st_polygonize(merged_lines) %>% st_as_sf() %>% mutate(cell_id = row_number()) # 给每个面单元加个唯一ID方便区分
3. 验证结果
用ggplot可视化看看效果,红线是原来的线要素,彩色块就是生成的独立面单元:
ggplot() + geom_sf(data = polygons_sf_auto, aes(fill = factor(cell_id))) + geom_sf(data = lines_sf, colour = "red", lty = 2) + theme(legend.position = "none")
为什么这个方法更靠谱?
- 适配不规整网格:哪怕你的线有小偏移,只要能形成闭合区域,
st_polygonize()都能准确识别,不像手动构建坐标那样容易出错。 - 代码简洁高效:不用手动计算每个多边形的四个顶点,尤其是网格规模大的时候,这个方法的优势会非常明显。
完整可运行代码
把整个流程串起来,直接复制就能跑:
library(sf) library(purrr) library(ggplot2) # 原始线要素数据 df <- data.frame( x_start = c(2:9,rep(1,8)), x_end = c(2:9,rep(10,8)), y_start = c(rep(1,8),2:9), y_end = c(rep(10,8),2:9) ) lines_sf <- pmap(df,function(x_start,x_end,y_start,y_end){ st_linestring( matrix( c( x_start, y_start, x_end, y_end), ncol = 2,byrow = TRUE) ) }) %>% st_as_sfc() # 核心:自动生成面要素 merged_lines <- st_union(lines_sf) polygons_sf_auto <- st_polygonize(merged_lines) %>% st_as_sf() %>% mutate(cell_id = row_number()) # 可视化验证 ggplot() + geom_sf(data = polygons_sf_auto, aes(fill = factor(cell_id))) + geom_sf(data = lines_sf, colour = "red", lty = 2) + theme(legend.position = "none")
这个结果和你手动构建的面单元完全一致,而且能轻松应对偏移的不规整网格,完美替代ESRI的工具~
内容的提问来源于stack exchange,提问作者Ratnanil
相关产品推荐
相关产品推荐

