我有一个用sf::st_make_grid()创建的矢量网格,其中有几列 价值观.我想将其转换为栅格堆栈,其中每一列的值都变成 栅格堆叠的一层.

下面我提供一个接近我想要实现的目标的例子. 我有两个问题:

  1. 这是解决这个问题的好方法吗?这不是一种更直接的方式来 将基本上是矢量网格的内容转换为栅格的像素?
  2. 当我将矢量格网和栅格相叠绘制时,格网单元 没有与栅格的像素对齐(请参阅使用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 的屏幕截图

enter image description here

我还试着从细胞质心的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)

推荐答案

数据中没有不一致.你可以看到,

plot(value1_raster)
lines(my_grid)

您会看到未对齐,因为您使用了"mapview"

mapview((value1_raster)) + mapview(my_grid)

这是因为mapview首先将数据转换到其底图的坐标参考系.经过变换后,多边形数据不再是规则格网.但栅格数据被转换为新的规则栅格,因此两个源现在未对齐.为了避免这种情况,您可以将nc转换为mapview使用的CRS.例如:

library(sf)
library(terra)
library(mapview)

my_cellsize <- 50000
nc <- st_read(system.file("shape/nc.shp", package = "sf")) |> 
    st_transform(crs = "+proj=webmerc +datum=WGS84") 
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,]
my_grid$value1 <- rnorm(nrow(my_grid))
template = rast(vect(my_grid), res = my_cellsize)
value1_raster <- rasterize(vect(my_grid), template, field = "value1")

mapview(value1_raster) + mapview(as.lines(vect(my_grid)))

此外,如果您的目标是创建栅格,那么首先创建多边形并对其进行栅格化似乎过于复杂和低效.你可以按照以下思路做一些事情:

library(terra)
nc <- vect(system.file("shape/nc.shp", package = "sf")) |> 
    project(y = "EPSG:3359") 

r <- rast(nc, res=50000)
r$value1 <- rnorm(ncell(r))
r$value2 <- rnorm(ncell(r))
r$value3 <- rnorm(ncell(r))

R相关问答推荐

从cv.glmnet R包中查找培训SSE

当y大于阈值和值范围时,在时间序列中突出显示区域

将带有范围的字符串转换为R中的数字载体

从嵌套列表中智能提取线性模型系数

R Markdown中的交叉引用表

R Highcharts与两个位置关联的注释

使用tidy—select创建一个新的带有mutate的摘要变量

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

R根据条件进行累积更改

多个过滤器内的一个盒子在仪表板Quarto

合并后返回列表的数据帧列表

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

计算直线上点到参考点的总距离

在另一个包中设置断点&S R函数

使用geom_iles在一个切片中包含多个值

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

是否有可能从边界中找到一个点值?

计算Mean by分组和绑定到R中的数据集

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?