读取NetCDF格式数据时出错

时间:2018-01-23 06:18:28

标签: r netcdf netcdf4

我正在为全世界提供NetCDF格式的aquaMODIS叶绿素数据。

我想从整个数据中仅裁剪longitude 70-85latitude 4-18的区域。然后我想聚合数据,我也想在聚合后绘制数据。

但是,我在阅读数据时遇到了问题:

  

ncvar_get(mayWEEK1)中的错误:第一个参数(nc)不属于ncdf4类!

请指导我这件事。

可以使用nc-data的示例here。我的语法如下:

# Adding packages             
library(raster)
library(ncdf4)
# Loading the data
mayWEEK1 <- "E:/NIOdisseratation_WORK/Aqua_MODIS_chlorophyll/MAY/2003/2003MAY_week1.nc"
ncfWEEK1 <- brick(mayWEEK1, var="chlor_a")

# Aggregation
mayfinal <- raster::aggregate(ncfWEEK1, 2)

# Cropping
rc1 <- crop(mayfinal, extent(70, 85, 4, 18))
plot(rc1)

1 个答案:

答案 0 :(得分:2)

UPD 根据建议@RobertH

我们讨论了两种从netCDF文件中读取数据的方法。

使用'raster'包

如果您专注于数据的快速可视化,那么最自然的方式是使用brick()包的raster功能:

var_name <- "sst" # for the example file  or "chlor_a" for your chkorophyll data    
ncfWEEK1 <- brick(mayWEEK1, varname = var_name) 

结果ncfWEEK1属于RasterBrick级。然后你可以使用这个类的print()方法来查看`ncfWEEK1中包含的数据的结构和属性为简单

raster::print(test_brick_box)

请注意,使用存储为RasterBrick类的数据进行进一步操作可能会非常棘手。

使用'ncdf4'包

如果您希望将数据读入最简单的R结构(双精度数组),那么ncdf4可能是更好的解决方案。但是,阅读您的数据看起来会更复杂一些:

首先,您必须打开文件

file_nc_obj <- nc_open(file_to_open_name, verbose = TRUE)

实际上,如果您仍然找到了处理数据的正确方法,最好设置verbose = FALSE。但是,您可以从verbose = TRUE开始检查文件的加载方式。

第二步是查看文件中数据的结构。变量file_nc_obj是ncdf4类的R对象。实际上,有一个类似列表的结构

str(file_nc_obj, max = 1) 

这意味着您可以像列表组件一样评估file_nc_obj的每个内置属性,例如

nc_dim_list <- file_nc_obj$dim

此外,nc文件本身还有一些内置属性;它们也可能很重要:

# read nc-attributes
fileForProc_attributes <- ncatt_get(file_nc_obj,varid=0)
str(fileForProc_attributes)

第三步实际上是使用ncvar_get()读取您的nc数据。有两个一般性建议:1)请仔细检查ncvar_get()ncdf4的帮助; 2)使用第二步中的结果以正确的方式定义请求。

作为示例附加的nc文件中的变量(包含海面温度"sst"的空间数据)可以理解如下:

var_lon <- ncvar_get(file_nc_obj,"lon")
var_lat <- ncvar_get(file_nc_obj,"lat")
var_value <- ncvar_get(file_nc_obj,"sst")
test_units <- ncatt_get(file_nc_obj, "sst" ,"units")$value
start_time <- ncatt_get(file_nc_obj, 0, "time_coverage_start")$value
end_time <- ncatt_get(file_nc_obj, 0, "time_coverage_end")$value

第四步不要忘记关闭文件

nc_close(file_nc_obj)

之后,您将准备好数据以进行分析和可视化。