使用terra处理Landfire栅格时INT1U范围外值被替换为NA的问题求助
处理Landfire栅格数据时数值溢出丢失的问题
问题现象
处理Landfire的Biophysical Settings(BPS)和现有植被高度(EVH)栅格数据时,遇到以下异常:
- 用
terra::rast()读取数据时显示正常,但裁剪或投影操作后,超出0-255范围(INT1U无符号8位整数)的数值全部被替换为NA,同时弹出警告detected values outside of the limits of datatype INT1U - 尝试用
terraOptions()设置默认数据类型为INT2S,无效果 - BPS数据处理流程正常,但EVH数据执行投影操作时触发上述数值丢失问题
原因分析
- 栅格元数据与实际数值不匹配:部分Landfire栅格(如EVH)的TIFF文件头标注数据类型为INT1U,但实际存储的数值超出了0-255的范围。Terra默认会严格遵循文件头的元数据类型执行操作,超出范围的值会被强制转为NA。
- terraOptions的作用限制:
terraOptions()中的datatype参数仅控制新创建栅格的默认类型,无法修改已读取栅格的现有数据类型。 - BPS数据无异常的原因:BPS的分类编码刚好全部落在INT1U的0-255范围内,因此裁剪/投影时不会触发溢出问题。
解决办法
核心是显式将栅格转换为能容纳更大数值的数据类型,推荐使用INT2S(有符号16位整数,范围-32768至32767)或INT2U(无符号16位整数,范围0至65535),再执行空间操作。
修复后的EVH数据处理代码
library(terra) # 读取原始EVH栅格 evhRaw <- terra::rast("./dataRaw/envTerr/LF2022_EVH_220_CONUS/Tif/LC22_EVH_220.tif") # 显式转换数据类型为INT2S,适配更大数值范围 evhRaw <- terra::cast(evhRaw, "INT2S") # 读取并投影边界 nc <- terra::vect("./dataTidy/cadastral/NCDOT_State_Boundary/NCDOT_State_Boundary.shp") ncp <- project(nc, evhRaw) # 裁剪+掩膜操作 evhNc <- terra::crop(evhRaw, ncp, mask = TRUE) # 投影操作(此时不会丢失数值) evhNcPlane <- terra::project(evhNc, "epsg:2264")
通用处理步骤
- 读取栅格后,先检查数据范围:
range(evhRaw, na.rm = TRUE),确认是否超出当前数据类型的范围 - 用
terra::cast()转换类型:cast(rast_obj, "INT2S"):转为有符号16位整数cast(rast_obj, "INT2U"):转为无符号16位整数
- 再执行裁剪、投影等后续空间操作
验证说明
转换数据类型后,重新执行裁剪和投影操作,不会再出现数值丢失的情况,警告信息也会消失。可以用plot()或range()函数验证结果的完整性。
内容的提问来源于stack exchange,提问作者Eliot Dixon
相关产品推荐
相关产品推荐

