删除质心不在栅格上的网格单元
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 中的所有事情,做一件事总是有多种方法。如果您尝试了我的建议并且它对您的真实数据没有效率,那么可能值得尝试寻找其他解决方案。
我有两个问题。
问题一: 我想删除质心不在栅格上的所有网格单元格。我什至不确定我是否在使用正确的 "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 中的所有事情,做一件事总是有多种方法。如果您尝试了我的建议并且它对您的真实数据没有效率,那么可能值得尝试寻找其他解决方案。