R语言terra包writeRaster导出asc栅格NODATA值异常解决方法
问题背景
使用R语言处理栅格数据时,分别调用raster、terra包的writeRaster函数导出ESRI ASCII(.asc)格式栅格,测试代码如下:
library(terra) library(raster) f <- system.file("external/test.grd", package="raster") r1 <- raster(f) plot(r1) writeRaster(r1, paste('Try1','.asc', sep=''), overwrite=TRUE) r2 <- rast(f) writeRaster(r2, paste('Try2','.asc', sep=''), overwrite=TRUE)
运行后对比两个输出文件发现:
raster包导出的Try1.asc中,文件头标注的NODATA_value为-3.4e+38,无值像元均存储为该数值,可被各类GIS软件正常识别terra包导出的Try2.asc中,无值标识为nan,该文本格式的无值标记会导致其他软件读取栅格时出现异常,手动在writeRaster中设置NAflag = -3.4e+38参数无法生效。
解决方法
terra包写入asc格式时,默认会将浮点型栅格的NaN/NA值直接输出为nan文本,不会自动替换为NAflag指定的数值,需要在写入时额外补充wopt列表中的nan参数,和NAflag保持一致,同时显式指定对应浮点数据类型,即可输出和raster包规范完全一致的asc文件,修正后的写入代码如下:
writeRaster( r2, "Try2_fixed.asc", overwrite = TRUE, NAflag = -3.4e+38, datatype = "FLT4S", wopt = list(nan = -3.4e+38) )
导出后可验证:
- asc文件头的
NODATA_value字段正确显示为-3.4e+38 - 所有无值像元位置均存储为
-3.4e+38数值,不存在nan文本 - 输出文件可被QGIS、ArcGIS等常规GIS软件正常读取,无值区域识别逻辑和
raster包输出文件完全一致
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

