调用getNOAA.bathy出现参数长度为零错误的求助
问题详情
已按GitHub论坛建议更新rgdal、raster及所有R包,从CRAN和GitHub安装的marmap包均无法正常使用。经检查输入的经纬度无小数问题,调用以下代码时出现报错:
ETPBathy <- getNOAA.bathy(lon1 = -98, lon2 = -79, lat1 = 7, lat2 = -6, resolution = 1)
报错信息:
ETPBathy <- getNOAA.bathy(lon1 = -98, lon2 = -79, lat1 = 7, lat2 = -6, resolution = 1)
Querying NOAA database ...
This may take seconds to minutes, depending on grid size
Error in if (ncol(x) == 3 & !exists("bathy", inherits = FALSE)) { : argument is of length zero
怀疑报错与R版本有关,寻求解决方法。
解决步骤
验证R版本兼容性
marmap包对R版本有最低要求,一般需要R 3.5.0及以上。执行sessionInfo()查看当前版本,若版本过低,直接升级到最新稳定版。排查网络与请求参数
报错提示返回数据为空,大概率是网络波动导致请求失败:- 切换稳定网络环境重试;
- 降低分辨率参数,比如把
resolution = 1改成resolution = 5,减少单次请求的数据量; - 确认目标经纬度范围是否合理(你的范围是有效的,这一步可快速跳过)。
重装依赖包并清理环境
依赖包安装不完整可能引发问题,按以下步骤操作:- 卸载现有marmap:
remove.packages("marmap") - 重启R会话,避免残留进程干扰;
- 安装完整依赖:
install.packages(c("rgdal", "raster", "ncdf4"))(ncdf4是marmap的隐性依赖,常被忽略); - 重新安装marmap:CRAN版用
install.packages("marmap"),开发版用devtools::install_github("ericpante/marmap")(需先装devtools)。
- 卸载现有marmap:
手动调试请求返回
直接查看NOAA服务器的返回内容,定位问题根源:library(marmap) # 构造marmap内部生成的请求URL url <- paste0("https://gis.ngdc.noaa.gov/mapviewer-support/wcs-proxy/wcs.groovy?", "request=GetCoverage&service=WCS&version=1.0.0&coverage=etopo1", "&CRS=EPSG:4326&BBOX=-98,-6,-79,7&format=xyz&resx=1&resy=1") # 下载并查看数据 x <- read.table(url, sep = "\t") str(x)如果
x为空,说明网络或服务器端存在问题;如果x有数据,说明marmap内部处理逻辑异常,可向GitHub仓库提交issue。替代方案:用raster包直接获取
若以上方法均无效,可换用raster包直接下载并处理NOAA数据:library(raster) # 下载ETOPO1全局地形数据 etopo <- raster("https://www.ngdc.noaa.gov/mgg/global/relief/ETOPO1/data/ice_surface/grid_registered/netcdf/ETOPO1_Ice_g_gmt4.grd") # 裁剪到目标区域 ETPBathy <- crop(etopo, extent(-98, -79, -6, 7)) # 转换为marmap的bathy格式(若需要) ETPBathy <- as.bathy(ETPBathy)
内容的提问来源于stack exchange,提问作者Salome Jaramillo Gil

