裁剪SpatRaster后原始栅格负值丢失问题求助
栅格裁剪后负值丢失问题解决
问题
使用terra包的crop工具从全球气候SpatRaster中提取美国和加拿大区域数据时,裁剪后的栅格丢失了原始数据中的负值,不符合预期。原代码及问题现象如下:
require(countrycode) ISO <- countrycode(c("US", "Canada"), origin = 'country.name', destination = 'iso3c') [1] "USA" "CAN" # shapefile require(geodata) shp <- gadm(country=ISO, level=0, path = ("North_Am", "Shapefile", sep="/"), version="latest") shp <- crop(shp, ext(-170, -50, 25, 90)) # 气候栅格 r <- "Bio6_1981-2010.tif" %>% rast(.) datatype(r) "INT2U" require(terra) cshp <- crop(r, shp, mask=TRUE) cshp class : SpatRaster dimensions : 6973, 14086, 1 (nrow, ncol, nlyr) resolution : 0.008333333, 0.008333333 (x, y) extent : -170.0001, -52.61681, 24.99986, 83.10819 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 (EPSG:4326) source : memory name : Bio6_1981-2010 min value : 0 # 此处不应丢失负值,但实际丢失了 max value : 20 plot(cshp)

原因
问题出在原始栅格的数据类型上:datatype(r)返回"INT2U",即无符号16位整数,这种数据类型的取值范围是0到65535,无法存储负值。原始数据中的负值会被自动转换为0,导致裁剪后结果丢失负值信息。
解决方案
先将栅格转换为支持负值的数据类型(比如有符号16位整数INT2S或浮点型FLT4S),再执行裁剪和掩膜操作。修改后的代码如下:
# 加载依赖包 library(countrycode) library(geodata) library(terra) library(magrittr) # 获取美加两国ISO3代码 ISO <- countrycode(c("US", "Canada"), origin = 'country.name', destination = 'iso3c') # 获取行政区划矢量并裁剪范围 shp <- gadm(country=ISO, level=0, path = file.path("North_Am", "Shapefile"), version="latest") shp <- crop(shp, ext(-170, -50, 25, 90)) # 读取气候栅格并转换数据类型 r <- rast("Bio6_1981-2010.tif") # 转换为有符号16位整数(支持负值) r <- rast(r, datatype = "INT2S") # 执行裁剪+掩膜 cshp <- crop(r, shp, mask=TRUE) # 查看结果 cshp
补充说明
INT2S是有符号16位整数,取值范围为-32768到32767,足以存储多数气候数据的负值;如果需要更高精度,可选择FLT4S(32位浮点型)。- 若直接转换类型无效,可先将栅格写入本地再重新读取:
writeRaster(r, "Bio6_signed.tif", datatype="INT2S", overwrite=TRUE) r <- rast("Bio6_signed.tif")
内容的提问来源于stack exchange,提问作者Tristan
相关产品推荐
相关产品推荐

