R中terra库加载HLS HDF4_EOS文件无法正确识别坐标系问题问询
问题原因说明
terra::crs(ImageIn)报错是因为你传入的ImageIn是文件路径字符串,crs()仅支持接收SpatRaster、SpatRasterDataset这类空间对象作为入参,不支持直接处理路径字符串,所以抛出找不到对应方法的错误。- 用
sds()读取整景HLS HDF文件时coord.ref显示为unnamed,是因为旧版本terra/GDAL对HDF4_EOS格式的全局元数据读取支持不足,投影信息实际存储在每个子数据集的元数据节点中,未被识别到全局SpatRasterDataset对象上。
解决方法
方法1:直接读取单个子数据集自动获取投影
HLS的投影信息绑定在每个子数据集的元数据中,直接通过子数据集完整路径读取单波段时,terra可自动识别投影:
# 提取HDF文件的所有子数据集路径 sds_paths <- grep("Grid:", describe("HLS.S30.T11TMM.2019310.v1.4.hdf", meta = FALSE), value = TRUE) # 读取指定子数据集,例如下标2对应B02波段 b02 <- rast(sds_paths[2]) # 查看投影 crs(b02)
方法2:手动为已读取的数据集赋值投影
HLS文件名的瓦片编码自带投影信息,比如文件名中的T11TMM代表UTM 11带北半球,对应EPSG编码32611,可直接手动赋值给已读取的SpatRasterDataset:
datat <- sds("HLS.S30.T11TMM.2019310.v1.4.hdf") # 赋值投影,两种方式二选一即可 crs(datat) <- "EPSG:32611" # 也可以使用你通过raster获取到的proj4字符串 # crs(datat) <- "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs" # 验证投影是否生效 crs(datat)
方法3:更新运行环境
升级到terra 1.7及以上版本,搭配GDAL 3.4及以上版本,新版对HDF4_EOS格式的元数据读取能力大幅提升,大部分场景下可自动识别HLS数据的投影,无需额外手动处理。
内容的提问来源于stack exchange,提问作者vsjansen
相关产品推荐
相关产品推荐

