r - 如何在 r 中的同一进程中在预先建立的区域内创建缓冲区和剪辑?
问题描述
我正在评估采矿在某些地区的影响,并看到这种影响的范围,我已经生成了一定距离的缓冲区。但是,有几个区域在空间上很接近,这些缓冲区最终会到达相邻区域。这已经成为一个问题,因为我正在评估 300 多个区域,并且很难通过视觉审查来消除不需要的缓冲区。而且我相信有一些技术,但我找不到任何技术。
如下例所示,我的受影响区域位于 a 中
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)
- 由于有更多的研究领域非常接近,我缓冲区的最后两个环到达邻近区域,这是不可取的。
解决它的一种方法是将其保留在形状上,仅将具有区域限制的多边形作为交叉点,但我有几个受影响的区域(多边形),在我看来,这是不可能的他们分开。
-
解决方案
这是一个最小的、独立的、可重现的例子,说明了这个问题
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)
推荐阅读
- azure - 未显示免费数据库的学生天蓝色
- r - 使用插值映射温度曲线
- javascript - d3.js 树状图如何将链接添加到叶节点并更改颜色
- c - strncmp 实际上是做什么的?
- javascript - Sequelize 查找两个日期之间的所有生日
- python - 编码器解码器模型中的双向 LSTM 在训练时内存不足
- r - 基于正负值着色的R图上的Extra Surface问题
- android - setDuration 在动画类中不起作用
- fortran - 在子例程中使用变量而不在 Fortran 中传递它们
- tesseract - 如何将字体转换为 .traindata 用于 tesseract?