如何利用matlab高效处理NC文件?

本文由SimpleHappy (QQ:129****987)投稿,在此公众号特别感谢!


NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目前,NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作 NetCDF 数据集。它能过记录多维度的格网数据,所以有必要通过matlab提取 NC文件数据。此外,我们可以把格网数据存储到NC文件保存。

一、NC文的读取

ncread语法规则

vardata = ncread(source,varname)

vardata = ncread(source,varname,start,count,stride)

功能:读取 NetCDF 数据源中的变量数据

1
2
3
NcPath='01.nc';
lon1 =ncread(NcPath,'lon');        %读取lon所有数据
lon2 =ncread(NcPath,'lon',2,3,4);   %从lon[2]开始,按间隔4,共读取3个数据

二、创建NC文件

(1) netcdf语法规则

1. ncid = netcdf.create(filename, mode)

①作用:创建新的NetCDF file

②常用mode:

'CLOBBER':覆盖现有文件

'NOCLOBBER':不覆盖现有文件

'SHARE':更新现有文件

③返回值ncid是文件的ID

2. ncid = netcdf.open(filename, mode)

①作用:打开NetCDF file

②常用mode:

'WRITE':读写

'SHARE':更新

'NOWRITE':只读

3. netcdf.endDef(ncid)

作用:结束NetCDF file定义模式

4. netcdf.close(ncid)

作用:关闭NetCDF file

(2) 维函数与变量函数

dimid = netcdf.defDim(ncid,dimname,dimlen)

%定义NetCDF 维度

varid = netcdf.defVar(ncid,varname,xtype,dimids)

%创建NetCDF 变量

netcdf.putVar(ncid,varid,data)

%对变量写入数据

1
2
3
dimidlat= netcdf.defDim(ncid,'latitude',180);      %定义名为大小为180的latitude的维度
varid=netcdf.defVar(ncid,'lat','double',dimidlat);   %创建该维度下的lat变量
netcdf.putVar(cid,varid,lat);                    %写入lat

NC文件创建与保存实例演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%创建NetCDF file
cid=netcdf.create('01.nc', 'CLOBBER');
%待写入数据
lon=-180:5:180;
lat=-87.5:2.5:87.5;
m=length(lon);
n=length(lat);
h=rand(n,m);
%定义维度
dimidlon=netcdf.defDim(cid,'lon',m);
dimidlat=netcdf.defDim(cid,'lat',n);
%创建变量
varid1=netcdf.defVar(cid,'lon','double',dimidlon);         %一维
varid2=netcdf.defVar(cid,'lat','double',dimidlat);          %一维
varid3=netcdf.defVar(cid,'h','double',[dimidlon dimidlat]);  %二维
%结束NetCDF file定义模式
netcdf.endDef(cid);
%写入变量
netcdf.putVar(cid,varid1,lon);
netcdf.putVar(cid,varid2,lat);
netcdf.putVar(cid,varid3,h');
%关闭NetCDF file
netcdf.close(cid);

三、拓展:利用GMT对NC文件中的格网数据插值

可以利用GMT对生成的.nc格式文件进行自动插值,并可以选择插值精度,十分方便,如下是对某网格数据插值实现的。

1
2
3
4
5
6
gmt begin Test png
gmt basemap -JX15c/8c -R-180d/180d/-87.5d/87.5d -Bx60 -By30 -BWSrt
gmt makecpt -Cjet -T0/70/5
gmt grdimage 01.nc -E1000  %核心
gmt colorbar -C -Bx10 -By+l"TECu" -DJMR+v+o1c/0c
gmt end

结果图

本例之所以提到GMT,一方面是因为GMT绘图质量比matlab高,且代码简单;另一方面,matlab可以和GMT联合编程,有兴趣的小伙伴可以学习GMT。

祝大家五一节快乐!

本文推荐指数:☆ (5/10分)

好不好用只有用了才知道!若觉得好,别忘分享给和您一样爱学习研究的小伙伴哦!

长按加入资源分享园地星球

互动专区

回复“微信”加入微信群;公众号中回复“qq”加入QQ群;回复“共享”加入原创代码共享QQ群;回复“投稿”与大家分享智慧;回复“下载”加入各种资源下载QQ群!

如需转载,请在公众号中回复“转载”获取授权,未经授权擅自搬运抄袭的,必将追究其责任!

参考资料:

[1] https://baike.baidu.com/item/netCDF/6000434?fr=aladdin

[2] https://ww2.mathworks.cn/help/matlab/ref/ncread.html

[3] https://ww2.mathworks.cn/help/matlab/network-common-data-form.html?s_tid=CRUX_lftnav

往期回顾>>>>>>

200多款plot/plot3自定义marker任你选

打造一款属于自己matlab版屏幕取色器

资源分享园地星球欢迎您的加入