如何确保空间点全部处于R语言Raster包生成的网格内?
确保所有空间点位于Raster网格内的解决方案
我正在进行空间模拟并创建了空间点,但使用R语言Raster包绘图时发现部分点位于网格外。需要确保所有点都在网格内,以便后续动态调整网格分辨率。
原始可复现代码
library(raster) set.seed(100) tmp = tmp2 = data.frame("x" = rnorm(1000, 10, 10),"y" = rnorm(1000, 10, 10)) coordinates(tmp) <- c("x", "y") r1 <- raster(tmp, resolution = 10) r1 <- rasterToPolygons(r1) plot(r1) for (a in 1:nrow(tmp2)) { d = tmp2[a,] pts <- d coordinates(pts) <- ~x+y plot(pts, add=T, col=a) }
编辑1:尝试基于XY极值定义网格仍有问题
尝试用坐标极值定义网格,但部分点仍处于网格外:
library(raster) set.seed(100) tmp = tmp2 = data.frame("x" = rnorm(1000, 10, 10),"y" = rnorm(1000, 10, 10)) coordinates(tmp) <- c("x", "y") r1 <- raster(xmn = min(tmp2$x), xmx = max(tmp2$x), ymn = min(tmp2$y), ymx = max(tmp2$y), resolution = 10) r1 <- rasterToPolygons(r1) plot(r1) for (a in 1:nrow(tmp2)) { d = tmp2[a,] pts <- d coordinates(pts) <- ~x+y plot(pts, add=T, col=a) }
解决方案
问题根源:raster()会根据设定的分辨率自动对齐网格边界,直接用坐标极值定义的范围,会导致边缘点落在网格之外。以下两种方法可以解决:
方法1:给极值添加分辨率一半的缓冲
给坐标的最小/最大值分别减去/加上分辨率的一半,确保最边缘的点能被网格单元格覆盖:
library(raster) set.seed(100) tmp = tmp2 = data.frame("x" = rnorm(1000, 10, 10),"y" = rnorm(1000, 10, 10)) coordinates(tmp) <- c("x", "y") res <- 10 # 给范围添加缓冲 xmn <- min(tmp2$x) - res/2 xmx <- max(tmp2$x) + res/2 ymn <- min(tmp2$y) - res/2 ymx <- max(tmp2$y) + res/2 r1 <- raster(xmn = xmn, xmx = xmx, ymn = ymn, ymx = ymx, resolution = res) r1 <- rasterToPolygons(r1) plot(r1) for (a in 1:nrow(tmp2)) { d = tmp2[a,] pts <- d coordinates(pts) <- ~x+y plot(pts, add=T, col=a) }
方法2:用alignExtent()对齐边界到网格
使用alignExtent()函数,将初始范围向外对齐到最近的网格边界,确保所有点都被包含:
library(raster) set.seed(100) tmp = tmp2 = data.frame("x" = rnorm(1000, 10, 10),"y" = rnorm(1000, 10, 10)) coordinates(tmp) <- c("x", "y") res <- 10 # 创建初始范围 init_ext <- extent(min(tmp2$x), max(tmp2$x), min(tmp2$y), max(tmp2$y)) # 向外对齐到网格边界 aligned_ext <- alignExtent(init_ext, raster(resolution=res), snap="out") r1 <- raster(aligned_ext, resolution = res) r1 <- rasterToPolygons(r1) plot(r1) for (a in 1:nrow(tmp2)) { d = tmp2[a,] pts <- d coordinates(pts) <- ~x+y plot(pts, add=T, col=a) }
注:
alignExtent()的snap="out"参数会优先向外扩展边界,保证原始范围的所有点都被包含在对齐后的网格中。
内容的提问来源于stack exchange,提问作者Sosa
相关产品推荐
相关产品推荐

