sf对象联合操作结果异常:如何获取4个单位面积空间要素?
解决sf对象空间叠加得到4个1单位要素的问题
哦,我懂你的困扰了——你想要把两个图层的多边形分割成四个1x1的小方块,但用st_union完全搞错了方向,它是用来合并几何对象的,不是做空间叠加分割的,这就是结果不符合预期的原因。
先理清楚你的原始数据:
east.west是左右两个2×2的矩形,每个面积2;north.south是上下两个2×2的矩形,每个面积2。
它们的叠加正好能把整个2×2的大正方形分成四个1×1的小方块,这才是你要的结果。
正确的做法:用st_intersection()替代st_union()
st_intersection()会计算两个sf对象的空间交集,自动把重叠区域分割成独立的要素,同时保留两个原始图层的所有属性。修改后的代码如下:
# 你的原始数据创建代码不变 east.west.sf <- st_sfc(st_polygon(list(cbind(c(1,2,2,1,1),c(0,0,2,2,0)))), st_polygon(list(cbind(c(0,1,1,0,0),c(0,0,2,2,0))))) east.west.df <- data.frame(var1=c("east", "west"), var2=c(1,2)) east.west <- st_sf(east.west.df, geom=east.west.sf) north.south.sf <- st_sfc(st_polygon(list(cbind(c(0,2,2,0,0),c(1,1,2,2,1)))), st_polygon(list(cbind(c(0,2,2,0,0),c(0,0,1,1,0))))) north.south.df <- data.frame(var3=c("north", "south"), var4=c(FALSE, TRUE)) north.south <- st_sf(north.south.df, geom=north.south.sf) # 替换成空间交集操作 map.overlay <- st_intersection(east.west, north.south) # 查看结果和每个要素的面积 print(map.overlay) st_area(map.overlay)
结果说明
运行这段代码后,你会得到4个独立的要素,每个都是面积为1的1×1正方形,同时每个要素会包含来自两个原始图层的属性(比如var1/var2和var3/var4),完全符合你的预期。
为什么st_union不对?
st_union的核心功能是合并几何对象,它会把所有输入的几何合并成一个(或按分组合并),并且自动消除重叠部分,所以你得到的是合并后整个几何的总面积,而不是分割后的多个要素。这和sp里的union()(处理两个图层时做的是叠加分割)不是同一个逻辑,sf里对应的叠加分割工具就是st_intersection()。
内容的提问来源于stack exchange,提问作者user13424
相关产品推荐
相关产品推荐

