将sf::st_make_grid生成的矢量网格转为栅格栈的问题咨询
解决方案
问题1:处理方式优化
当前逐个字段调用rasterize()的方法是可行的,但有更高效直接的实现方式:
方法1:terra批量生成栅格栈
terra::rasterize()支持直接传入多个字段名,一次性生成包含所有属性列的栅格栈,无需循环处理:
# 转换为terra矢量对象 my_grid_vect <- vect(my_grid) # 直接指定多个字段,生成栅格栈 stacked_raster <- rasterize(my_grid_vect, template, field = c("value1", "value2", "value3"))
方法2:stars批量处理
结合dplyr的across()可以批量对多列进行栅格化:
library(stars) library(dplyr) # 生成匹配的栅格模板后,批量栅格化属性列 template_stars <- st_as_stars(st_bbox(my_grid), dx = my_cellsize, dy = my_cellsize, crs = st_crs(my_grid), values = NA_real_) stacked_raster_stars <- my_grid |> mutate(across(c(value1, value2, value3), ~st_rasterize(., template_stars))) |> st_as_stars()
问题2:对齐问题修复
对齐问题的核心是栅格模板的原点与矢量网格的原点不匹配。st_make_grid()生成的网格是基于输入要素的边界严格计算的,而默认生成的栅格模板会自动调整范围,导致错位。
修正后的代码(terra版本)
# 获取矢量网格的精确边界 grid_bbox <- st_bbox(my_grid) # 基于边界和单元格大小,计算栅格模板的原点(确保与网格单元对齐) x_min <- grid_bbox[["xmin"]] y_min <- grid_bbox[["ymin"]] # 构建完全匹配的栅格模板 template_aligned <- rast( xmin = x_min, xmax = grid_bbox[["xmax"]], ymin = y_min, ymax = grid_bbox[["ymax"]], res = my_cellsize, crs = st_crs(my_grid)$wkt ) # 生成对齐的栅格栈 stacked_raster_aligned <- rasterize(vect(my_grid), template_aligned, field = c("value1", "value2", "value3")) # 验证对齐 mapview(stars::st_as_stars(stacked_raster_aligned)) + mapview(my_grid)
修正后的代码(stars版本)
# 指定offset参数,确保栅格原点与矢量网格一致 template_stars_aligned <- st_as_stars( st_bbox(my_grid), dx = my_cellsize, dy = my_cellsize, crs = st_crs(my_grid), offset = c(grid_bbox[["xmin"]], grid_bbox[["ymin"]]), # 对齐原点 values = NA_real_ ) # 栅格化并验证 value1_raster_aligned = st_rasterize(my_grid["value1"], template_stars_aligned) mapview(stars::st_as_stars(value1_raster_aligned)) + mapview(my_grid)
内容的提问来源于stack exchange,提问作者Gilles San Martin
相关产品推荐
相关产品推荐

