You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不是同一个实例:

  1. macOS平台从CRAN直接安装的二进制版terra,会打包编译时内置的GDAL、PROJ等依赖,不会调用本地通过brew/其他方式安装的系统GDAL。
  2. 1.5-34版本terra的macOS预编译包存在编译缺陷,内置GDAL没有打包netCDF驱动,因此识别nc格式时直接返回空格式名,触发报错。
  3. 终端能调用gdalinfo正常读取,只能证明系统安装的GDAL支持netCDF,和terra内置的GDAL能力无关。
  4. 可在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 -e 'install.packages("terra", type = "source")'
    
    安装完成后回到R,执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:27:13