You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保空间点全部处于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:25:21