1.查看nc文件中变量
% ncdisp(source) 显示组、维度、变量定义,以及所有属性
ncdisp('2001.nc');
运行结果如下:
Source:
F:\river1\2001.nc
Format:
classic
Global Attributes:
Conventions = 'COARDS'
History = 'created by wgrib2'
GRIB2_grid_template = 0
Dimensions:
latitude = 682
longitude = 662
time = 365 (UNLIMITED)
Variables:
latitude
Size: 682x1
Dimensions: latitude
Datatype: double
Attributes:
units = 'degrees_north'
long_name = 'latitude'
longitude
Size: 662x1
Dimensions: longitude
Datatype: double
Attributes:
units = 'degrees_east'
long_name = 'longitude'
time
Size: 365x1
Dimensions: time
Datatype: double
Attributes:
_FillValue = 9.999e+20
units = 'seconds since 1970-01-01 00:00:00.0 0:00'
long_name = 'verification time generated by wgrib2 function verftime()'
reference_time = 978307200
reference_time_type = 2
reference_date = '2001.01.01 00:00:00 UTC'
reference_time_description = 'analyses, reference date is variable, min found reference date is given'
time_step_setting = 'auto'
time_step = 86400
var1_0_7_no_level
Size: 662x682x365
Dimensions: longitude,latitude,time
Datatype: single
Attributes:
_FillValue = 9.999000260554009e+20
short_name = 'var1_0_7_no_level'
long_name = 'desc'
level = 'no_level'
units = 'unit'
可以看到,本文件中有经度、纬度、时间、var1_0_7_no_level(其实是河流流量)数据。
var1_0_7_no_level是三维数组(662×682×365,经度×纬度×时间),由于本文件为grid2转格式生成的nc文件,一般的文件units哪里都有这个变量的单位如(立方米/s)
2.查看完变量之后对变量进行读取
% vardata = ncread(source,varname)
runoff = ncread('2001.nc','var1_0_7_no_level');
3.由于需要读取很多年的数据,文件夹下有很多nc文件,此时,批量读取文件把他们存在一个结构体之中
% nc文件所在路径
Path='F:\river1';
% 显示文件夹下所有符合后缀名为.nc文件的完整信息
File=dir(fullfile(Path,'*.nc'));
% 提取符合后缀名为.nc的所有文件的文件名,转换为n行1列
FileNames={File.name}';
FNcount=length(FileNames);
% 批量读取-这里提供两种方式
% 方法1 每年一个变量存储
% 数据覆盖的年份
s_year = 2001:2020;
for i = 1:FNcount
val_struct = ncread(char(FileNames(i)),'var1_0_7_no_level');
% 变量名随循环改变 scs_rd_2001,scs_rd_2002......
eval(['scs_rd_' num2str(s_year(i)) '= val_struct;']);
end
% 方法2 存成struct
% 个人喜欢方法2,把所有年的变量存到一个struct里面很方便
% 但是数据量太多内存不够可能跑到一半卡了阿巴阿巴
for i = 1:FNcount
scs_rd(i).year = s_year(i);
scs_rd(i).rd = ncread(char(FileNames(i)),'var1_0_7_no_level');
end
% 最后的最后把他们save到mat里面,记得把经纬度数据也存进去~