我有一个形状文件,由州边界内的海和河多边形组成(从地形覆盖图(栅格)和州边界(多边形形状文件)中裁剪和蒙面)。在一个州边界内,我有多个多边形(在我的例子中有1500多个不同的多边形),我想从边缘和20米向内(就像一个内部缓冲区)提取区域。但就我的情况而言,我所有的多边形都不是完美的,有的是河流,有的只是方形(距离栅格10*10米),还有一些是大湖。我的问题是如何为多边形创建这个“内部缓冲区”,因为所有多边形,甚至不是多边形的所有部分都需要有缓冲区(因为它们小于40米,两边都有20米的缓冲区)。
让我给你看看我的代码和我已经走了多远。
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米处创建buffer
?这是可能的吗?在这种情况下,是如何做到的?
pol <- test[904, ]
cent <- st_centroid(pol)
最后,正如在开始时提到的,我想移除这个“内部部分”,最后只从边缘和内部得到20米。
发布于 2020-05-12 02:30:55
与其从中间往外工作,你就不能像你说的那样,使用内部缓冲区从边缘开始工作吗?
用一个可复制的示例来帮助您会更容易,但是给定一个包含多边形的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
当然这会让小多边形消失。您可能可以设置一个条件缓冲区大小,但如果您需要帮助,请发布一个示例!
https://stackoverflow.com/questions/61746656
复制