我有一个shapefile,由状态边界内的海洋和河流多边形组成(从Landcover地图(栅格)和状态边界中裁剪和蒙版(多边形shapefile))。在状态边界内,我有多个多边形(在我的情况下,超过1500个不同的多边形),我想从边缘和向内20 m处提取区域(如内部缓冲区)。但就我而言,我的所有多边形的形状都不完美,有的是河流,有的只是正方形(距离栅格文件10 * 10 m),有的是大湖。我的问题是如何为多边形创建此“内部缓冲区”,因为所有多边形,甚至不是多边形的所有部分都需要具有缓冲区(因为它们小于40 m,因此每侧缓冲区20 m)。
让我告诉我我的代码以及我走了多远。
poly <- jvk_18[53,]
cropped <- crop(mark_data, poly, snap = "near")
masked <- mask(cropped, poly)
sjo <- (masked == 61)
sjo <- clump(sjo, directions = 8, gaps = T)
所以这里只是州边界内的
cropping
,masking
和clumping
海洋和河流的抽取。
此外,我已将数据转换为MULTIPOLYGON
test <- st_as_stars(sjo)
test <- st_as_sf(test, merge = TRUE)
test <- st_cast(test, "MULTIPOLYGON")
此后,我找到了st_centroid
函数来检测多边形的中间点。我的下一个问题是,是否可以从质心到边缘20 m处创建buffer
?这可能吗,在那种情况下,怎么办?
pol <- test[904, ]
cent <- st_centroid(pol)
最后,如开头所述,我想删除此“内部部分”,最后仅从边缘和向内获得20 m。
不是像您说的那样使用内部缓冲区,您不能从中心向外工作吗?
为您提供一个可重现的示例会更容易,但是考虑到包含多边形的SF对象poly
,我会做类似的事情:
core <- st_buffer(poly, -20) %>% st_union() # this will shrink your edges by your desired amount, 20m (and union to tidy up)
diff <- st_difference(poly, core) # difference will leave you with the 20 m ring, removing the core
当然,这会使小多边形消失...您可能可以设置条件缓冲区的大小,但是如果需要帮助,请发布示例!