如何在 r 中的同一进程中在预先建立的区域内创建缓冲区和剪辑?

Posted

技术标签:

【中文标题】如何在 r 中的同一进程中在预先建立的区域内创建缓冲区和剪辑?【英文标题】:how to create buffers and clip within pre-established areas, within the same process in r? 【发布时间】:2021-03-05 00:17:16 【问题描述】:

我正在评估采矿在某些地区的影响,并为了了解这种影响的范围,我已经生成了一定距离的缓冲区。但是,有几个区域在空间上很接近,这些缓冲区最终会到达相邻区域。这已经成为一个问题,因为我正在评估 300 多个区域,并且很难通过视觉审查来消除不需要的缓冲区。 而且我相信有一些技术,但我找不到任何技术。

如下例所示,我的受影响区域位于 shapefile 中,而我的研究区域位于另一个 shapefile 中:

plot(study_area)
plot(impacted_area, add=T)

按照我的做法,我首先使用 gbuffer 函数生成缓冲区。

library(rgeos)

#generate the buffers arround the impacted areas

my_buffer<- rgeos::gBuffer(impacted_area, width = 10000, byid = T)



###centroid remove 
my_buffer.er <- erase(my_buffer, impacted_area)

后来,为了建立界限,我使用了相交工具。此方法有效,但可以到达其他邻近区域。

 library(raster)
 study_area.bff <-raster::intersect(my_buffer.er, study_area)
由于有更多的研究区域非常接近,我缓冲区的最后两个环到达邻近区域,这是不可取的。

这将是预期的剪辑:

解决它的一种方法是将其保留在形状上,只是具有要成为交叉点的区域限制的多边形,但我有几个受影响的区域(多边形),在我看来,它会是不可能分开处理。

-

【问题讨论】:

【参考方案1】:

这是一个说明问题的最小的、独立的、可重现的示例

library(raster)
p1 <- rbind(c(-180,-20), c(-140,55), c(-60, 0), c(-140,-60), c(-180,-20))
p2 <- rbind(c(-45,0), c(0,60), c(40,5), c(15,-45), c(-45,0))
pols <- spPolygons(p1, p2)
xy <- SpatialPoints(rbind(cbind(-73.65, 1.75), cbind(-39.28, 2.35)))
xy <- SpatialPointsDataFrame(xy, data.frame(id=1:2))
b <- buffer(xy, 7000000, dissolve=FALSE)

plot(pols)
points(xy, cex=2, pch=20)
lines(b, col="blue", lwd=2)

在我看来,您可以通过将缓冲区与其对应的多边形相交来解决此问题。你可以按照这些思路做一些事情

ptpol <- extract(pols, xy)

x <- list()
for (i in 1:length(b)) 
    x[[i]] <- intersect(b[i,], pols[ptpol$poly.ID[i], ])

x <- do.call(rbind, x)

lines(x, col="red", lwd=4)

【讨论】:

很抱歉我没有树立一个可复制的例子。实际上,我要在其中生成缓冲区的文件也是多边形,当我尝试执行建议的函数时:ptpol 你上面的建议基本上是我需要的,但是,我的情况的正确方法是使用这样的多边形:p3 我不明白你的多边形有什么不同,或者你的意思是替换提取功能。最好编辑您的问题,在您使用这些多边形的地方添加一些代码并显示您遇到的问题。

以上是关于如何在 r 中的同一进程中在预先建立的区域内创建缓冲区和剪辑?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中在A数据库下如何访问B数据库中的C表:

linux一天一个脚印:进程的管理

如何在工作在同一共享内存区域的两个进程之间共享锁?

Linux进程通信 | 共享内存

操作系统知识点总结

linux 中的多进程中,父进程与子进程共享的代码段和数据段、堆栈段,是整个程序还是出现在fork()函数后?