Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在polyon R中从质心到距离边缘20 m处创建缓冲区_R_Buffer_Polygon_Edges_Centroid - Fatal编程技术网

在polyon R中从质心到距离边缘20 m处创建缓冲区

在polyon R中从质心到距离边缘20 m处创建缓冲区,r,buffer,polygon,edges,centroid,R,Buffer,Polygon,Edges,Centroid,我有一个形状文件,由州边界内的海洋和河流多边形组成,从土地覆盖地图光栅和州边界多边形形状文件中裁剪和屏蔽。在一个州边界内,我有多个多边形,在我的例子中有1500多个不同的多边形,我想从边缘和20米内向提取区域,就像一个内部缓冲区一样。但就我而言,我所有的多边形都不是完美的形状,有些是河流,有些是距离rasterfile 10*10米的正方形,有些是大湖。我的问题是如何为多边形创建这个内部缓冲区,因为所有多边形,甚至不是多边形的所有部分都需要缓冲区,因为它们小于40米,每边缓冲20米 让我告诉你我

我有一个形状文件,由州边界内的海洋和河流多边形组成,从土地覆盖地图光栅和州边界多边形形状文件中裁剪和屏蔽。在一个州边界内,我有多个多边形,在我的例子中有1500多个不同的多边形,我想从边缘和20米内向提取区域,就像一个内部缓冲区一样。但就我而言,我所有的多边形都不是完美的形状,有些是河流,有些是距离rasterfile 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)
之后,我找到了st_形心函数来检测多边形的中点。这里我的下一个问题是,是否有可能创建从质心到距离边缘20 m的缓冲区?这可能吗?在这种情况下,如何实现

pol <- test[904, ]
cent <- st_centroid(pol)

最后,正如一开始提到的,我想去掉这个内部部分,最终只得到从边缘向内20米的距离

你不能像你说的那样使用内部缓冲区,而不是从中心向外工作,从边缘向内工作吗

用一个可复制的示例来帮助您会更容易,但如果有一个包含多边形的sf对象多边形,我会执行以下操作:

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

当然,这会使小多边形消失。。。您可能可以设置条件缓冲区大小,但如果需要帮助,请发布一个示例

哇,非常感谢!它确实起作用了。我有点担心它不能处理比缓冲区本身小的多边形,但是计算机只给了我一个警告,仍然给我多边形的面积,包括缓冲区。太好了!你能考虑投票还是接受这个答案?我也是新来的:
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