使用R语言terra包读取COG时如何忽略/强制设置缩放与偏移
问题描述
我正在使用terra包从LPCLOUD加载大量HLS.S30和HLS.L30格式的COG作为SpatRaster。发现部分影像像素值为0-1000的整数,另一部分是0-1的浮点数。通过terra::describe检查文件后确认,部分文件带有“Offset: 0, Scale:0.0001”字段,部分没有,这是数据不一致的原因。
请问是否可以忽略这些缩放/偏移参数,或者在使用terra::rast读取数据时强制设置scale=1、offset=0?是否可通过GDAL选项实现?
可复现示例(需NASA Earthdata登录):
library(terra) setGDALconfig("GDAL_HTTP_UNSAFESSL", value = "YES") setGDALconfig("GDAL_HTTP_COOKIEFILE", value = ".rcookies") setGDALconfig("GDAL_HTTP_COOKIEJAR", value = ".rcookies") setGDALconfig("GDAL_DISABLE_READDIR_ON_OPEN", value = "EMPTY_DIR") setGDALconfig("CPL_VSIL_CURL_ALLOWED_EXTENSIONS", value = "TIF") url1 <- "https://data.lpdaac.earthdatacloud.nasa.gov/lp-prod-protected/HLSS30.020/HLS.S30.T32ULC.2022237T103641.v2.0/HLS.S30.T32ULC.2022237T103641.v2.0.B08.tif" url2 <- "https://data.lpdaac.earthdatacloud.nasa.gov/lp-prod-protected/HLSS30.020/HLS.S30.T31UGT.2022237T103641.v2.0/HLS.S30.T31UGT.2022237T103641.v2.0.B08.tif" r1 <- rast(url1, vsi=TRUE) r2 <- rast(url2, vsi=TRUE) r1[1] r2[2] describe(url1) describe(url2)
解决方案
方法1:读取后手动重置scale和offset
直接用terra::setScale和terra::setOffset覆盖原有参数,将scale设为1、offset设为0:
# 读取影像 r1 <- rast(url1, vsi=TRUE) r2 <- rast(url2, vsi=TRUE) # 重置缩放偏移参数 r1 <- setScale(r1, 1) |> setOffset(0) r2 <- setScale(r2, 1) |> setOffset(0) # 验证结果 r1[1] r2[2]
方法2:读取时通过GDAL选项强制忽略缩放偏移
通过GDAL的GDAL_DISABLE_SCALING配置项,在读取阶段直接跳过缩放偏移的应用:
# 设置全局GDAL配置,强制忽略缩放偏移 setGDALconfig("GDAL_DISABLE_SCALING", "TRUE") # 读取影像,此时自动跳过scale/offset应用 r1 <- rast(url1, vsi=TRUE) r2 <- rast(url2, vsi=TRUE) # 验证结果 r1[1] r2[2]
注意:该配置是全局生效的,若后续需要恢复正常读取,需重置配置:
setGDALconfig("GDAL_DISABLE_SCALING", "FALSE")
方法3:读取时指定raw=TRUE参数
terra::rast的raw参数可控制是否读取原始像素值(不应用scale和offset),设置为TRUE即可直接获取0-1000的整数:
r1 <- rast(url1, vsi=TRUE, raw=TRUE) r2 <- rast(url2, vsi=TRUE, raw=TRUE) # 验证结果 r1[1] r2[2]
内容的提问来源于stack exchange,提问作者j.vandoninck
相关产品推荐
相关产品推荐

