我有一个用sf::st_make_grid()
创建的矢量网格,其中有几列
价值观.我想将其转换为栅格堆栈,其中每一列的值都变成
栅格堆叠的一层.
下面我提供一个接近我想要实现的目标的例子. 我有两个问题:
- 这是解决这个问题的好方法吗?这不是一种更直接的方式来 将基本上是矢量网格的内容转换为栅格的像素?
- 当我将矢量格网和栅格相叠绘制时,格网单元 没有与栅格的像素对齐(请参阅使用mapview的最后一行).我希望至少它们的质心会对齐. 所以,我想我做错了什么.
library(sf)
library(terra)
my_cellsize <- 50000
# Load the 'nc' shapefile from the sf package
nc <- st_read(system.file("shape/nc.shp", package = "sf")) |>
st_transform(crs = 3359) # projection in meters
# Create a grid within the extent of the 'nc' dataset
my_grid <- st_make_grid(nc, cellsize = my_cellsize)
my_grid <- st_sf(GridID = 1:length(my_grid), my_grid)
my_grid <- my_grid[nc,]
# add some random values
my_grid$value1 <- rnorm(nrow(my_grid))
my_grid$value2 <- rnorm(nrow(my_grid))
my_grid$value3 <- rnorm(nrow(my_grid))
# convert the vector grid into a raster stack
template = rast(vect(my_grid), res = my_cellsize)
value1_raster <- rasterize(vect(my_grid), template, field = "value1")
value2_raster <- rasterize(vect(my_grid), template, field = "value2")
value3_raster <- rasterize(vect(my_grid), template, field = "value3")
stacked_raster <- c(value1_raster, value2_raster, value3_raster)
# interactivbe map showing that the 2 set of grid cells do not overlap correctly
library(mapview)
mapview(stars::st_as_stars(value1_raster)) + mapview(my_grid)
以下是显示矢量格网和栅格像素之间未对齐的小叶 map 的屏幕截图
我还试着从细胞质心的xy坐标开始.但如果我理解得很好,只有当我在正方形网格上有值时,这才会起作用.在这里,位于感兴趣区域之外的单元格被视为缺少值并触发错误消息(不允许缺少值)
data.frame(
my_grid |> st_centroid() |> st_coordinates(),
my_grid[,c("value1", "value2", "value3"), drop = TRUE]
) |>
rast(type = "xyz", extent= ext(my_grid), crs = "EPSG:3359")
我也try 了{stars}
次,但没有成功:
template = st_as_stars(st_bbox(my_grid), dx = my_cellsize, dy= my_cellsize, values = NA_real_)
value1_raster = st_rasterize(my_grid, template)
mapview(stars::st_as_stars(value1_raster)) + mapview(my_grid)