【R语言】批量替换TIFF栅格中的NA值为0

R语言批量将TIFF栅格中的NA值替换为0

    • 1. 问题背景
    • 2. 安装并加载terra包
    • 3. 完整代码
    • 4. 代码说明
      • 4.1 设置输入文件夹
      • 4.2 创建输出文件夹
      • 4.3 获取所有TIFF文件
      • 4.4 读取栅格数据
      • 4.5 将NA替换为0
      • 4.6 设置输出文件名
      • 4.7 保存处理结果
      • 4.8 显示处理进度
    • 5. 增加文件检查的改进版本
    • 6. 处理结果检查
    • 7. 注意事项
      • 7.1 NA与0的含义不同
      • 7.2 避免把输出文件夹再次作为输入
      • 7.3 数据类型需要与原始数据匹配
      • 7.4 建议保留原始文件
    • 8. 总结

1. 问题背景

在进行物种适生区预测、遥感数据处理或空间分析时,经常需要批量处理 TIFF 格式的栅格数据。

部分栅格在研究区外或无有效数据的位置通常被赋值为NA,即空值。如果后续需要进行栅格叠加、面积统计、模型计算或数据格式转换,栅格中的NA可能导致计算结果缺失。因此,可以根据实际分析需求,将栅格中的NA批量替换为0

本文使用 R 语言中的terra包,对指定文件夹中的所有.tif.tiff文件进行批量处理,并将处理后的结果保存到新的文件夹中,避免覆盖原始数据。

需要注意的是,将NA替换为0会改变栅格中空值区域的含义。执行该操作前,应确认0在研究中能够代表非适生区、无覆盖区域或其他合理含义。


2. 安装并加载terra包

首次使用terra包时,需要先安装:

install.packages("terra")

安装完成后加载该包:

library(terra)

terra是目前 R 语言中常用的空间栅格数据处理包,可以读取、计算、裁剪、重采样和导出 GeoTIFF 等多种空间数据。


3. 完整代码

# 首次使用请安装:# install.packages("terra")library(terra)# TIFF 所在文件夹input_dir<-"F:/Mal/1TIFF"# 输出到新文件夹,避免覆盖原始数据output_dir<-file.path(input_dir,"NA_to_0")dir.create(output_dir,showWarnings=FALSE)# 同时匹配 .tif 和 .tiff 文件tif_files<-list.files(input_dir,pattern="\\.(tif|tiff)$",full.names=TRUE,ignore.case=TRUE)# 查看读取到的栅格文件tif_files# 循环处理所有栅格for(fintif_files){# 读取栅格r<-rast(f)# 将 NA 空值替换为 0r[is.na(r)]<-0# 设置输出文件路径out_file<-file.path(output_dir,basename(f))# 保存处理后的栅格writeRaster(r,out_file,overwrite=TRUE,datatype="FLT4S",gdal=c("COMPRESS=LZW"))message("已完成:",basename(f))}message("全部处理完成。输出文件夹:",output_dir)

4. 代码说明

4.1 设置输入文件夹

input_dir<-"F:/Mal/1TIFF"

input_dir用于指定待处理 TIFF 文件所在的文件夹。

在 R 语言中,Windows 路径建议使用正斜杠/,也可以使用双反斜杠\\,例如:

input_dir<-"F:\\Mal\\1TIFF"

4.2 创建输出文件夹

output_dir<-file.path(input_dir,"NA_to_0")dir.create(output_dir,showWarnings=FALSE)

该代码会在输入文件夹中创建一个名为NA_to_0的子文件夹,用于保存处理结果。

使用新的输出文件夹可以避免直接覆盖原始栅格,便于后续检查和数据恢复。

参数showWarnings = FALSE表示当文件夹已经存在时,不显示警告信息。


4.3 获取所有TIFF文件

tif_files<-list.files(input_dir,pattern="\\.(tif|tiff)$",full.names=TRUE,ignore.case=TRUE)

其中:

  • pattern = "\\.(tif|tiff)$":同时匹配.tif.tiff文件;
  • full.names = TRUE:返回文件的完整路径;
  • ignore.case = TRUE:忽略文件扩展名的大小写,因此也可以识别.TIF.TIFF

可以通过以下代码查看识别到的文件:

tif_files

4.4 读取栅格数据

r<-rast(f)

rast()函数用于读取当前 TIFF 文件,并将其转换为SpatRaster对象。

如果 TIFF 文件包含多个波段,terra会同时读取所有波段。


4.5 将NA替换为0

r[is.na(r)]<-0

其中,is.na(r)用于识别栅格中的所有空值像元,然后将这些像元统一赋值为0

处理完成后:

  • 原有有效像元值保持不变;
  • 原有NA像元被替换为0

对于物种适生区预测结果,若0表示非适生区,则这种处理通常比较直观。但如果NA表示研究区之外的区域,则应谨慎替换,否则可能在后续面积统计中将研究区外区域错误地计入非适生区。


4.6 设置输出文件名

out_file<-file.path(output_dir,basename(f))

basename(f)用于提取原始文件名,file.path()则将输出文件夹与文件名组合起来。

因此,输出栅格会保留原始文件名,仅改变文件的存储位置。


4.7 保存处理结果

writeRaster(r,out_file,overwrite=TRUE,datatype="FLT4S",gdal=c("COMPRESS=LZW"))

主要参数说明如下:

  • overwrite = TRUE:如果输出文件已经存在,则允许覆盖;
  • datatype = "FLT4S":以32位浮点型格式保存栅格;
  • gdal = c("COMPRESS=LZW"):使用 LZW 无损压缩,减小输出文件体积。

如果原始栅格仅包含整数值,也可以根据实际数据范围选择整型格式。但对于 MaxEnt、BIOMOD2 或其他物种分布模型输出的连续适生概率数据,使用FLT4S通常更加合适。


4.8 显示处理进度

message("已完成:",basename(f))

每完成一个文件,R 控制台都会显示当前处理完成的文件名。

所有文件处理完成后,会输出结果文件夹路径:

message("全部处理完成。输出文件夹:",output_dir)

5. 增加文件检查的改进版本

为了避免输入文件夹中没有 TIFF 文件时程序直接运行,可以增加文件数量检查:

library(terra)input_dir<-"F:/Mal/1TIFF"output_dir<-file.path(input_dir,"NA_to_0")dir.create(output_dir,showWarnings=FALSE,recursive=TRUE)tif_files<-list.files(input_dir,pattern="\\.(tif|tiff)$",full.names=TRUE,ignore.case=TRUE)if(length(tif_files)==0){stop("输入文件夹中未找到 .tif 或 .tiff 文件,请检查文件路径。")}for(fintif_files){tryCatch({r<-rast(f)r[is.na(r)]<-0out_file<-file.path(output_dir,basename(f))writeRaster(r,out_file,overwrite=TRUE,datatype="FLT4S",gdal=c("COMPRESS=LZW"))message("已完成:",basename(f))},error=function(e){message("处理失败:",basename(f),";错误信息:",e$message)})}message("批量处理结束。输出文件夹:",output_dir)

该版本增加了以下功能:

  1. 输入文件夹中没有 TIFF 文件时停止运行;
  2. 单个文件处理失败时显示错误信息;
  3. 某个文件报错不会影响其他文件继续处理;
  4. 使用recursive = TRUE确保输出目录能够正常创建。

6. 处理结果检查

处理完成后,可以随机读取一个输出栅格,检查是否还存在NA

result_file<-file.path(output_dir,basename(tif_files[1]))result_raster<-rast(result_file)global(is.na(result_raster),fun="sum",na.rm=TRUE)

如果返回结果为0,说明该栅格中已经不存在NA像元。

也可以查看栅格的最小值和最大值:

minmax(result_raster)

或者绘制处理后的栅格:

plot(result_raster)

7. 注意事项

7.1 NA与0的含义不同

在栅格数据中:

  • NA通常表示没有数据、研究范围之外或数据缺失;
  • 0是一个实际存在的数值。

因此,将NA替换为0后,原来的空值区域会参与后续统计分析。是否需要替换,应根据具体研究目的决定。

7.2 避免把输出文件夹再次作为输入

本文的代码只读取input_dir文件夹当前层级中的 TIFF 文件,不会递归读取NA_to_0子文件夹,因此不会重复处理输出结果。

7.3 数据类型需要与原始数据匹配

本文使用:

datatype="FLT4S"

该类型适用于包含小数的连续型栅格,例如物种适生概率、环境变量和模型预测结果。

如果数据为整数分类栅格,可以根据数值范围选择INT1UINT2S或其他整型数据格式。

7.4 建议保留原始文件

批量修改栅格前,建议始终将结果保存到新文件夹中,不要直接覆盖原始数据。这样可以避免因参数设置错误或数据含义判断错误造成不可逆的数据损失。


8. 总结

本文利用 R 语言的terra包,实现了以下功能:

  • 批量读取指定文件夹中的.tif.tiff文件;
  • 将栅格中的所有NA值替换为0
  • 保留原始文件名称;
  • 将处理结果保存到新的文件夹;
  • 使用 LZW 无损压缩减少文件体积;
  • 在控制台中显示处理进度。

该方法适用于物种适生区预测、MaxEnt模型结果处理、遥感栅格预处理和环境变量数据整理等场景。在实际应用中,应重点区分NA0的生态学和空间含义,避免对后续面积统计和空间分析产生影响。