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

2020-05-08 11:11:29 浏览数 (1)

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 数据源中的变量数据

代码语言:javascript复制
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)

%对变量写入数据

代码语言:javascript复制
dimidlat= netcdf.defDim(ncid,'latitude',180);      %定义名为大小为180的latitude的维度
varid=netcdf.defVar(ncid,'lat','double',dimidlat);   %创建该维度下的lat变量
netcdf.putVar(cid,varid,lat);                    %写入lat

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

代码语言:javascript复制
%创建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格式文件进行自动插值,并可以选择插值精度,十分方便,如下是对某网格数据插值实现的。

代码语言:javascript复制
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分)

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

0 人点赞