使用RSpatial Terra包栅格化矢量数据失败求助
解决terra::rasterize无有效像素的问题
核心原因分析
出现Failed to compute min/max, no valid pixels found警告的常见原因有两个:
- right_join导致部分几何丢失:
right_join(naro_2020, by = "key_code")会保留naro_2020的所有行,若某些key_code在grid_city_2020子集中不存在,对应行的几何会变成空值(NA),无法参与栅格化。 - 栅格模板与jpgrid网格未对齐:日本1km网格(JGD2011,EPSG:6670)是严格按1km间隔对齐的,直接用
ext(cities_vector)生成的栅格,其像素边界可能和网格边界完全错位,导致多边形与像素无交集。
分步解决方案
1. 过滤空几何行
先清理掉cities_polygon中几何为空的行,避免无效数据干扰:
cities_polygon <- head(grid_city_2020, n = 30) %>% grid_as_sf(crs = 6670) %>% mutate(key_code = as.character(grid), key_code = as.numeric(key_code)) %>% right_join(naro_2020, by = "key_code") %>% filter(!st_is_empty(geometry)) # 新增:过滤空几何
2. 创建与jpgrid对齐的栅格模板
利用jpgrid的网格边界特性,生成完全对齐的1km栅格:
# 获取网格的精确边界框 grid_bbox <- grid_bbox(cities_polygon$grid) # 创建对齐后的栅格模板 template_raster <- rast( ext = ext(grid_bbox$xmin, grid_bbox$xmax, grid_bbox$ymin, grid_bbox$ymax), resolution = 1000, crs = crs(cities_polygon) )
如果没有grid_bbox函数,也可以手动调整边界到1km整数倍:
bb <- st_bbox(cities_polygon) xmin <- floor(bb[1]/1000)*1000 ymin <- floor(bb[2]/1000)*1000 xmax <- ceiling(bb[3]/1000)*1000 ymax <- ceiling(bb[4]/1000)*1000 template_raster <- rast( ext = ext(xmin, xmax, ymin, ymax), resolution = 1000, crs = crs(cities_polygon) )
3. 重新执行栅格化
cities_vector <- vect(cities_polygon) cities_raster <- rasterize(cities_vector, template_raster, field = "avg_hot_days_35") # 验证结果 plot(cities_raster) plot(cities_vector, add = TRUE, border = "red", lwd = 0.5) # 叠加多边形看是否对齐
额外验证步骤
- 执行
table(st_is_empty(cities_polygon$geometry))确认无空几何 - 执行
plot(template_raster); plot(cities_vector, add=TRUE)检查多边形是否落在栅格范围内
内容的提问来源于stack exchange,提问作者Villas di Ampiastrada
相关产品推荐
相关产品推荐

