删除质心不在栅格上的网格单元

Delete cells of grid whose centroid is not over a raster

我有两个问题。

问题一: 我想删除质心不在栅格上的所有网格单元格。我什至不确定我是否在使用正确的 "types of objects"(RasterLayer、SpatialPixels 等)。

请参阅下面的虚拟数据示例:

# Load package 
library(raster)

# Create raster and define coordinate reference system
ras <- raster(nrows = 100, ncol = 100, xmn = 0, xmx = 100, ymn = 0, ymx = 100)
proj4string(ras) <- CRS("+init=epsg:32198")

# Generate random values
val <- sample(x = 1:100, size = ncell(ras), replace = T)
values(ras) <- val

# Create effort grid
xym <- matrix(c(-30,130,130,-30,-30,-30,130,130), nrow = 4, ncol = 2) 
p <- Polygon(xym)
ps <- Polygons(list(p), 1)
sps <- SpatialPolygons(list(ps))
proj4string(sps) <- CRS("+init=epsg:32198")
data <- data.frame(f = 99.9)
spdf <- SpatialPolygonsDataFrame(sps, data)
ptsreg <- spsample(spdf, 50, type = "regular")
grid <- SpatialPixels(ptsreg)

# Plot raster over grid
plot(grid)
plot(ras, add = T)

问题 2:是否有另一种创建努力网格的方法?我的代码有效,但我很确定有更简单的方法?

另外...在这个例子中,我首先绘制了网格并添加了栅格。如果我以另一种方式进行(首先是栅格,然后是网格),生成的图不会显示网格的整个范围。

如何在栅格上绘制网格但仍显示整个网格?如:

对于你的第一个问题,这里有一个选项。尝试:

cont <- as(extent(ras), "SpatialPolygons") 
proj4string(cont ) <- CRS("+init=epsg:32198")
grid.small <- grid[!is.na(grid%over%cont)]

您首先使用栅格的范围制作多边形,然后使用 %over% 函数对网格进行子采样。我认为它可以为您提供所需的结果。

对于你的第二个问题,它不是最好的,但试试:

plot(grid)
plot(ras,add=T)
plot(grid,add=T)

简单有效。通常,

plot(ras,ext=extent(grid))
plot(grid,add=T)

应该可以,但不行,我不明白为什么...

对于 R 中的所有事情,做一件事总是有多种方法。如果您尝试了我的建议并且它对您的真实数据没有效率,那么可能值得尝试寻找其他解决方案。