R语言terra包栅格化报错[writeStart]文件已存在,求解决方案
问题分析与解决
错误原因
- 文件写入冲突:你在循环里每次调用
rasterize都指定输出 DOM {"j Ad� try计划区域油 Des向这Run Prepare在循环里每次调用rasterize都指定输出到mask.tif,第一次循环生成该文件后,后续循环因为overwrite=FALSE的设置,不允许覆盖已存在的文件,直接触发报错。 - 逻辑错误:每次栅格化都基于初始的空白栅格
r,等于每次都从头开始,之前CSV填充的内容完全没保留,根本没法把36个文件的点都合并到同一个栅格里。
修正方案
核心思路:先初始化一个全为1的栅格(满足未覆盖区域默认值要求),然后逐次把每个CSV的点值更新到这个栅格上,最后一次性输出结果文件。
修正后的代码:
library(terra) # 1. 创建全为1的初始栅格(未覆盖区域默认值就是1) r <- terra::rast(ncols=129600, nrows=64800, xmin=-180, xmax=180, ymin=-90, ymax=90, resolution = 0.002777778, crs="+proj=longlat +datum=WGS84") r[] <- 1 # 给所有单元格赋值1 # 获取文件夹里的CSV文件(过滤只取CSV,避免读取其他文件) file_list <- list.files(getwd(), pattern = "\\.csv$", full.names = TRUE) # 循环处理每个CSV for(f in file_list){ # 读取CSV并转为矢量点 temp <- read.csv(f) v <- terra::vect(temp, geom = c("lon", "lat"), crs = "+proj=longlat +datum=WGS84") # 栅格化当前CSV的点到临时栅格,只保留有值的部分(NA为未覆盖) temp_rast <- terra::rasterize(x = v, y = r, field = "value") # 将临时栅格里的非NA值更新到主栅格r中 r <- terra::cover(r, temp_rast) # 清理临时对象释放内存 rm(temp, v, temp_rast) gc() # 强制垃圾回收,处理大文件时很有用 } # 最后一次性输出结果文件 terra::writeRaster(r, filename = file.path(getwd(), 'mask.tif'), overwrite = TRUE)
关键改动说明
- 初始栅格直接赋值为1,满足未覆盖区域的要求。
- 循环中不再直接写入结果文件,而是先栅格化到临时对象,再用
cover()函数把新的点值覆盖到主栅格上(只更新有值的单元格,不影响已有的1)。 - 最后统一输出文件,避免重复写入冲突,同时
overwrite=TRUE确保如果之前有旧文件可以覆盖。 - 给
list.files加了pattern = "\\.csv$",确保只读取CSV文件,避免误读其他格式文件。 - 加入
gc()主动回收内存,处理大型CSV时能减少内存占用。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

