terra包rast读取.nc文件报GDAL error 4问题求助
问题现象
使用terra包读取.nc格式文件时触发报错:
'' not recognised as a supported file format. (GDAL error 4)
可复现代码如下(测试nc文件大小16MB):
if (!file.exists("HadISST_ice.nc")) { download.file("https://www.metoffice.gov.uk/hadobs/hadisst/data/HadISST_ice.nc.gz","HadISST_ice.nc.gz") R.utils::gunzip("HadISST_ice.nc.gz") } library(terra) hadISST <- rast('HadISST_ice.nc')
该文件可通过raster::brick正常打开,但无法通过terra::rast读取。根据terra作者的公开说明,这是因为raster包使用ncdf4库读取文件,而terra包通过GDAL库读取文件。
在系统终端中直接调用GDAL工具可正常打开该.nc文件,gdalinfo执行结果如下:
% gdalinfo HadISST_ice.nc Driver: netCDF/Network Common Data Format Files: HadISST_ice.nc Size is 512, 512
但在R环境中调用terra读取该文件始终触发GDAL error 4,当前运行环境信息:
- R版本:4.2.0 (2022-04-22)
- 运行平台:x86_64-apple-darwin17.0 (64-bit),系统为macOS Monterey 12.4
- 加载的terra版本:1.5-34
- 系统安装GDAL版本:3.5.0, released 2022/05/10
原因排查
核心原因是CRAN预编译版本的terra自带独立的GDAL依赖,和你系统终端调用的GDAL不是同一个实例:
- macOS平台从CRAN直接安装的二进制版terra,会打包编译时内置的GDAL、PROJ等依赖,不会调用本地通过brew/其他方式安装的系统GDAL。
- 1.5-34版本terra的macOS预编译包存在编译缺陷,内置GDAL没有打包netCDF驱动,因此识别nc格式时直接返回空格式名,触发报错。
- 终端能调用gdalinfo正常读取,只能证明系统安装的GDAL支持netCDF,和terra内置的GDAL能力无关。
- 可在R中执行
terra::gdal(drivers=TRUE)验证,如果输出的驱动列表里找不到netCDF项,即可确认是该问题。
解决方案
按操作成本从低到高排序:
- 方案1:升级terra到最新稳定版本
后续版本的terra已经修复了macOS预编译包缺netCDF驱动的问题,直接升级到最新版即可:install.packages("terra") - 方案2:源码编译安装terra,链接本地支持netCDF的系统GDAL
如果升级后问题仍存在,打开macOS终端执行以下命令,安装过程会自动读取本地gdal-config的配置,链接已经装好的3.5.0版本GDAL:
安装完成后回到R,执行R -e 'install.packages("terra", type = "source")'terra::gdal(drivers=TRUE)确认驱动列表存在netCDF,即可正常读取nc文件。 - 方案3:用ncdf4做中转绕开GDAL链路
如果暂时不想重编译或升级包,可以借助ncdf4读取nc数据后手动转成SpatRaster对象,示例:library(ncdf4) library(terra) # 读取nc文件 nc_con <- nc_open("HadISST_ice.nc") # 提取经纬度与目标变量,注意变量名要和nc文件内的实际命名一致 lon <- ncvar_get(nc_con, "longitude") lat <- ncvar_get(nc_con, "latitude") ice_data <- ncvar_get(nc_con, "ice") nc_close(nc_con) # 构造SpatRaster对象,nc数据存储纬度为倒序,需要转置调整 hadISST <- rast(t(ice_data), ext = ext(min(lon), max(lon), min(lat), max(lat)), crs = "EPSG:4326")
内容的提问来源于stack exchange,提问作者marine-ecologist
相关产品推荐
相关产品推荐

