NetCDF文件概要与读写

2023-11-17

 NetCDF简介
NetCDF(network Common Data Format),即网络通用数据格式。最早是由美国国家科学委员会资助之计划--Unidata --所发展,其用意是在Unidata计划中不同的应用项目下,提供一种可以通用的数据存取方式,数据的形状包括单点的观测值、时间序列、规则排列的网格、以及人造卫星或雷达之影像档案。
NetCDF 可简单的视为一种存取接口,任何使用 NetCDF 存取格式的档案就可称为 NetCDF 档案;至于 NetCDF 这套软件的功能,在于提供C、Fortran、C++、Perl、或其它语言I/O的链接库,以让程序发展者可以读写数据文件,其本身具有说明的能力、并且可以跨越平台和机器的限制。每一个NetCDF档案可以含括多维度的、具有名称的变量,包括长短的整数、单倍与双倍精度的实数、字符等,且每一个变量都有其自我介绍的数据,包括量度的单位、全名及意义等文字说明,在此摘要性的檔头之后,才是真正的数据本身。
NetCDF接口是一种多维的数据分布系统,由这个接口所产生的档案,具有多维的数据格式,当你需要其中的某一笔数据时,程序将不会从第一笔数据读到你所需要的数据处,而是由 NetCDF 软件直接存取那一个数据。如此一来将会大量的降低模式运算时数据存取的时间。但也就是因为这样, NetCDF 所需要的空间是很大的,因为他多了很多的自解释的申明。

 NetCDF文件结构

   

对NETCDF文件的操作主要有读和写两个方面,在了解这两个方面内容之前,首先需要了解NETCDF文件的结构,NETCDF文件主要是Dimensions, Variables, Attributes, Data 四个部分组成的:
Dimensions主要是多维资料的结构,如经度、纬度、时间等
Variables各种变量,像温度等
Attributes一些辅助记忆的说明,如变量的单位等
Data主要资料部分

下面是NETCDF文件基本结构图(箭头指向为可操作的对象)

NETCDF文件基本结构图
根据NETCDF文件的这种特殊的结构,所使用的NcFile类中包含了NcDim, NcVar, NcAtt几个类的对象作为成员,分别对应了上面的Dimensions, Variables, Attributes部分。
NetCDF文件的读写
 
1.1     建工程文件
用vc6建立一个工程,使用动态链接库netcdf,然后把文件netcdfcpp.h
netcdfcpp.cpp ,ncvalues.h ncvalues.cpp,ncconfig.h包含到工程中。
1.2     NETCDF文件的读取
首先,定义一个NcFile类的对象,用NcFile类的构造函数直接对其初始化
NcFile(const char * path, FileMode = ReadOnly , … … );
path为文件的存储路径,FileMode为文件的打开方式,除了ReadOnly还有Write, New, Replace 等方式我们只是读文件可以选择ReadOnly,其他方式后面会介绍到,其他参数可以使用默认值,例如:
NcFile nc("G://File.nc", NcFile::ReadOnly);
使用nc.is_valid()来判断文件打开是否成功,以便进行下一步对NETCDF文件数据进行读取。
 
NETCDF文件主要是Dimensions, Variables, Attributes, Data 四个部分组成的,下面读出文件各个部分的内容。
 
    Dimensions:
 
可以使用NETCDF 的成员函数num_dims()获得文件中的Dimensions的个数,然后用NcFile类的另一个成员函数get_dim(int id),或get_dim(NcToken name)---参数可以是id号(int),也可以是dim名字(NcToken),获得每一个文件的Dimensions,用NcDim类的成员函数id(),name(),size()可以依次读出每一个Dimensions的id号,名称,和size。
例如:
   for (int i=0;i<nc.num_dims()-1;i++)
   {
      
       String.Format(String+"dimid=%d   name=%s length=%d/n",nc.get_dim(i)->id(),
          nc.get_dim(i)->name(),nc.get_dim(i)->size());
   }
   利用一个for循环,依据dim的id号可以一次读出所有dim的信息
 
 
Variables:
 
          同理用NETCDF 的成员函数num_vars()可以获得文件中Variables数量,用NcFile类get_var(int id)或 get_var(NcToken name)可以读出每一个文件中的Variables,也可以读出id,name这些信息,所不同的是,Variables还可以用num_dims()读出其所包含的Dimensions的个数,Variables还可以用get_dim(int id)读出其包含的Dimensions的相关信息,同时文件的Data信息也是通过Variables来操作的。
      Data的读出:
                    首先,我们要根据Variables包含的每一个Dimensions的size计算出数据的大小,定义一个相应大小的数组,用来存放数据。
                    然后,用Variables的get(TYPE *array,long *num)第一个参数是刚才定义的存放数据的数组,第二个参数是自定义的一维数组,数组的元素用来存放每一维的size.一般用于多维数据。例如:
             float rhs[50];
             long array[3];
             array[0]=1;
             array[1]=5;
             array[2]=10;
             nc.get_var("rh")->get(rhs,array);
             还可以用Variables的get( TYPE* vals,long edge0=0,long edge1=0,long edge2=0,long edge3=0,long edge4=0) const 第一个参数是存放数据的数组,后面的参数分别记录第1,2,3,4,5维的size,默认值为0,例如:
                   int n=nc.get_dim("lat")->size();
                   int lats[5];
                   nc.get_var("lat")->get(lats,n);
                   for (i=0;i<5;i++)
                   {
                           String.Format(String+"    %d",lats[i]);
               
                   }
            如果Variables中还包含说明的Attributes,可以使用函数get_att(int id),参数为Attributes的id,读出其Attributes。
            例如:
            String.Format("/natt:/n%s:%s/n",nc.get_var(0)->get_att(0)->name(),
                nc.get_var(0)->get_att(0)->as_string(0));
 
Attributes:
          Attributes可分为两种一种是整个文件的说明,即global attributes可以通过NcFile类的get_att(int id)函数来获得,参数为id号,例如:
String.Format(String+"/n%s: %s",nc.get_att(0)->name(),nc.get_att(0)->as_string(0));
还有一种是的说明,可以通过在Variables说明的方法获得,从读出的信息主要包括名称和相应的内容,可以通过name()和as_Type(long id),Type根据Attributes数据的类型来确定,如as_string(long id),as_int(long id)等,as_Type(long id)函数主要是用来取出每个Variables的内容。例子在Variables后面。
          Data:
          通过Variables我们已经把数据读出。
1.3     NETCDF文件的写入
和读文件时一样,首先要定义一个NcFile类的对象,如:
NcFile nc("G://File.nc", NcFile:: Replace);
用nc.is_valid()来判断文件打开是否成功,文件的打开方式我们可以选择New建立一个新的文件,用这种方式如果文件已经存在会返回错误,也可以用Write和Replace。选择Replace,如果文件已存在原文件就会被覆盖掉。用Write时文件必须已经存在,写入文件的数据会加在文件已存在数据的后面。
    首先,建立一个NETCDF文件,需要写入的数据和刚才读出的数据是一样的,有Dimensions, Variables, Attributes, Data;
Dimensions:
用NcFile类的add_dim(NcToken name,long dimsize)成员函数加入Dimensions,如果size 为unlimited用NcFile类的add_dim(NcToken name)函数,NcFile类会自动把其size处理为unlimited。
例如:
nc.add_dim("lat",5);
nc.add_dim("time");//size 为unlimited时
 
Variables:
用NcFile类的add_var(NcToken name,NcType type,type dim1,type dim2,… …)成员函数加入Variables,dim1,…,dimn,为Variables中包含的Dimensions。
    例如:
nc.add_var("lat",ncInt,nc.get_dim(0));//一个dim时
nc.add_var("rh",ncFloat,nc.get_dim("time"),
nc.get_dim("lat"),nc.get_dim("lon"));//多个dim时
 
Attributes:
整个文件的Attributes用NcFile的add_att(NcToken attname,Type value)函数Type根据加入Attributes的类型来判断;Variables可以用其成员函数add_att(attname, Type value)加入。
例如:
//写入文件的主要参数
    nc.add_att("sourse","Fictional Model Output");
    //写入单个变量的参数
    nc.get_var(0)->add_att("long_name","Temperature");
 
Data:
先定义一个数组,把要写入文件的数据写入数组,用 Variables的函数put(TYPE *arr,const long *count)TYPE 为数据类型或Variable的函数put( TYPE* vals,long edge0=0,long edge1=0,long edge2=0,long edge3=0,long edge4=0) const,第一个参数是存放数据的数组,后面的参数分别记录第1,2,3,4,5维的size,默认值为0,例如:
int lats[5]={20,30,40,50,60};                             //lat
    nc.get_var("lat")->put(lats,5);
    float rhss[50];
    for (int i=0;i<1;i++)
       for (int j=0;j<5;j++)
           for (int k=0;k<10;k++)
           {
               rhss[i*5*10+j*10+k]= (float)(i*5*10+j*10+k+1)/100; 
           }
    long count[3];                   //由于rh有多个dim,要定义一个一维数组
    count[0] = 1;                    //来说明其每一维的size
    count[1] = 5;
    count[2] = 10;
    nc.get_var("rh")->put(rhss,count);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NetCDF文件概要与读写 的相关文章

随机推荐

  • Linux的目录切换和用户管理

    切换目录 在使用linux系统的时候 会用cd来切换目录 cd 切换到根目录 cd 切换到主目录 cd 切换到之前工作目录 cd 虽然很方便但只能保存一次目录 pushd命令使用目录堆栈可以把多个目录存放起来 配套使用pushd popd
  • android实现共享数据

    计划是在后台开个service定位服务 前台需要经纬度的时候 从service获取 实现过程如下 public GPSService minTime UnTaskCheckingActivity minTime minDistance Un
  • mpc模型预测控制从原理到代码实现 mpc模型预测控制详细原理推导 matlab和c++两种编程实现

    mpc模型预测控制从原理到代码实现 mpc模型预测控制详细原理推导 matlab和c 两种编程实现 四个实际控制工程案例 双积分控制系统 倒立摆控制系统 车辆运动学跟踪控制系统 车辆动力学跟踪控制系统 包含上述所有的文档和代码 ID 564
  • 接口自动化平台(三):Promise简介 + 前端 + 后端 + 联调

    目录 1 Promise 2 接口自动化平台前端开发 2 1 前端环境搭建 2 2 新建用例页 CreateCase 2 2 1 增加路由信息 config routes ts 2 2 2 增加对应后端接口的信息 config proxy
  • 启动项

    size medium 1 imjpmig exe是微软Microsoft输入法编辑器程序 是微软Microsoft输入法编辑器程序 我给禁用了 每什么影响似乎 2 ctfmon exe是Microsoft Office产品套装的一部分 提
  • Docker运行MySQL5.7

    步骤如下 1 获取镜像 docker pull mysql 5 7 2 创建挂载目录 mkdir home mydata data mkdir home mydata log mkdir home mydata conf 3 先启动dock
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • PCL去除地面

    如图所示 分别是 原图 gt 直通滤波后 gt 取地面的图 gt 取地面的凹凸四边行加地面上的物体图
  • C++初学知识点总结

    C 学习笔记 1 namespace 所谓的namespace就是指标识符的各种可见范围 C 标准程序中的所有标识符都被定义于一个名为std的namespace中 2 iostream与iostream h的差别 差别当然不只是一个带后缀
  • redis做计数器相关

    最近在准备晋升PPT 发现品牌粉丝数和新浪微博的计数本质一样 哎 之前就发现了 就是没深入 要深入啊 品牌粉丝数设计相关 a Redis在计数器场景上的应用 http www searchdatabase com cn showconten
  • Unity SpriteAtlas实战使用

    前言 图集计划使用sprite atlas 但是看了网上资料用于实战的有点少 自己总结下 Unity 版本2019 4 9f1 图集设置 Sprite Packer Mode Disabled 就是不会生成图集 Enable For Bui
  • 二叉树的先序,中序,后序遍历

    java 二叉树的先序 中序 后序遍历 一 前序遍历 访问顺序 先根节点 再左子树 最后右子树 上图的访问结果为 GDAFEMHZ 1 递归实现 public void preOrderTraverse1 TreeNode root if
  • 自动化测试与禅道工具

    目录 1 什么是自动化测试 2 自动化测试分类 1 单元测试 2 接口自动化测试
  • 经验:数据库中性别、状态、字典使用什么字段?

    结论 使用char类型 长度为1 0表示女 1表示男 char类型可以在java中转换成String 方便前端进行判断转换 而且方便在Java代码中进行转换 比如excel导出时使用 如 gender gender equals 1 男 女
  • 纯前端--原生js将html页面变成pdf文件(html2canvas+jsPDF)

    一 html2canvas 将dom变成图片 下载或者安装html2canvas 官网 1 将文档放在本地 用原生js进行引用和使用 新建一个名为 html2canvas min js 的文件 并且将线上的内容进行复制 引入 js 文件 j
  • java+ssm汽车维修管理系统

    项目介绍 java ssm汽车维修管理系统 java ssm汽车维修管理系统 技术和环境 技术 ssm html jq 环境 jdk1 7 mysql5 7 tomcat8 x idea eclipse 数据库表的数量 7张 是否为mave
  • element-ui实现多级checkbox关联选择(权限管理)

    1 依赖element ui 只是使用了el checkbox 可以很轻松替换掉 效果图
  • 告诉你外汇交易中心最有可能掉入的九个坑

    一 外汇真能赚钱吗 预期目标多少才算合理 玩外汇的人越来越多 大部分人都是奔着暴利去的 但是现实很残酷 这个市场95 的人都是亏钱的 努力多年都不一定能赚多钱 所以想入坑的人 如果没有足够的经济支撑 不要参与这个残酷的游戏 外汇的难度大于期
  • SQL语句中的条件查询

    条件查询 什么是条件查询 不是将表中所有数据都查出来 而是查询出符合条件的 语法格式 select 字段1 字段2 from 表名 where 条件 具体条件有 lt lt gt gt 或 lt gt between and is null
  • NetCDF文件概要与读写

    NetCDF简介 NetCDF network Common Data Format 即网络通用数据格式 最早是由美国国家科学委员会资助之计划 Unidata 所发展 其用意是在Unidata计划中不同的应用项目下 提供一种可以通用的数据存