NetCDF(network Common Data Form)由位于科罗拉多州波尔市的 Unidata 程序中心开发,主要应用于大气科学的研究。NetCDF 的数据模式具有简单性和灵活性的特点。NetCDF 文件的基本组成为变量、属性和维数:

  • 变量为标量或多维数组。NetCDF 所支持的 IDL 数据类型有 string、byte、int、long、float 和 double
  • 属性包含一个变量或这个文件的附加性质。包含变量信息(如单位、有效范围、尺度因子等)的属性称作变量属性;包含文件信息的属性称作全局属性。属性可以是标量或一维数组,支持的数据类型为 string、byte、int、long、float 和 double
  • 维数为长整形标量,记录了一个或多个变量的大小

参考:NetCDF 格式文件入门参考:NetCDF 入门

从数学上来说,NetCDF 存储的数据就是一个多自变量的单值函数。 用公式来说就是 f(x,y,z,...) = value,函数的自变量 x,y,z 等在 NetCDF 中叫做 (dimension) 或坐标轴 (axis),函数值 value 在 NetCDF 中叫做变量 (Variables)。而自变量和函数值在物理学上的一些性质,比如计量单位 (量纲)、物理学名称等等在 NetCDF 中就叫属性 (Attributes)。

注意:IDL读取数据与在其他软件上显示的数据位置相反,左上对右下!

注意:NetCDF记录数据与实际数据是通过一个数量关系获取的,如下图所示:

实际结果 = 显示结果 × scale_factor + add_offset


数据:可以从 http://www.gumley.com 中下载这些例子的数据文件:

  • image.nc
  • sao.nc

常用的 NetCDF 程序

名     称 功     能 名     称 功     能
NCDF_OPEN() 打开一个 NetCDF 文件 NCDF_ATTNAME() 返回一个属性名称
NCDF_CLOSE 关闭一个 NetCDF 文件 NCDF_CREATE() 创建一个 NetCDF 文件
NCDF_VARID() 返回一个变量标识符 NCDF_DIMDEF() 创建一个维度
NCDF_VARGET 读取一个变量 NCDF_VARDEF() 创建一个变量
NCDF_ATTGET 读取一个属性 NCDF_ATTPUT 写入属性数据
NCDF_INQUIRE() 返回文件信息 NCDF_CONTROL 开始或结束定义模式
NCDF_VARINQ() 返回变量信息 NCDF_VARPUT 写入变量数据

常用的标准 NetCDF 文件属性

属性名称 定      义
long_name 详细描述变量的字符串(如“Northwards velocity component”)
units 描述变量单位的字符串(如“meters/second”)
valid_range 一个两元素的数组,包含变量有效的最小和最大值(如 [0.0, 5.0]),
该属性的类型必须和变量类型一致
scale_factor 变量读取以后作用于变量的一个乘数(允许 float 值存在 short 或 byte 类型),
该属性的类型必须和需要的变量类型一致(如浮点型)
add_offset 变量读取完毕,并且 scale_factor 使用后,加入到变量的一个偏值,
该属性的类型必须和需要的变量类型一致(如浮点型)
FillValue 表示没有数据写入的一个值,该属性的类型必须和变量的类型一致
  • NCDF_OPEN:【函数】打开一个 NetCDF 文件,返回值是这个文件的 NetCDF ID 值。
           语法:Result = NCDF_OPEN( Filename [, /NOWRITE | , /WRITE] )
  • NCDF_CLOSE:关闭一个 NetCDF 文件。
           语法:NCDF_CLOSE, Cdfid
  • NCDF_VARID:【函数】返回一个变量标识符,变量 ID,如果返回值为 -1 说明变量不存在。
           语法:Result = NCDF_VARID(Cdfid, Name)
  • NCDF_VARGET:读取一个变量。
           语法:NCDF_VARGET, Cdfid, Varid, Value [, COUNT=vector] [, OFFSET=vector] [, STRIDE=vector]
           说明:Cdfid 是 NCDF_OPEN 函数获取的返回值;
                       Varid 是 NCDF_VARID 函数获取的返回值;
                       Value 是读取变量的结果;
                       COUNT 是每维中读取元素的数目(默认情况是从当前 offset 的位置到每维的最后一个元素);
                       OFFSET 是每维中读取的第一个元素(从零开始,默认为 [0, 0, ... ,0];
                       STRIDE 是在每维中提取的间隔(默认为 [1, 1, ... , 1],意味着每个元素均被选中)。
           注意:如果 offset、count 或 stride 导致变量超出了范围,则 IDL 在读取时将舍去超出的部分,并给出错误信息。
    image.nc 在 HDFView 中显示如下:
    IDL> cd, 'F:\IDL\netCDF'
    IDL> cdfid = ncdf_open('image.nc')
    IDL> varid = ncdf_varid(cdfid, 'image')
    IDL> ncdf_varget, cdfid, varid, data
    IDL> help,data
    DATA BYTE = Array[, ]
    IDL> tvscl, data
    IDL> cdfid = ncdf_open('image.nc')
    IDL> varid = ncdf_varid(cdfid, 'image')
    IDL> ncdf_varget, cdfid, varid, data, offset=[,], count=[,], stride=[,]
    IDL> help, data
    DATA BYTE = Array[, ]
    IDL> tvscl, data
    IDL> ncdf_varget, cdfid, varid, data, offset=[,], count=[,], stride=[,]
    % NCDF_VARGET: Requested read is larger than data in dimension . Reducing COUNT
    to .
  • NCDF_ATTGET:读取一个属性。
           语法:NCDF_ATTGET, Cdfid [, Varid] , Name, Value [, /GLOBAL]
           说明:Name 是包含属性名称的字符串;
                       Value 获取变量结果。
    IDL> cdfid = ncdf_open('sao.nc')
    IDL> varid = ncdf_varid(cdfid, 'PRECIP')
    IDL> ncdf_attget, cdfid, varid, 'long_name', attvalue
    IDL> print, attvalue IDL> string(attvalue)
    precipitation amount
  • NCDF_INQUIRE:返回文件信息
         【函数】返回值是一个结构体,{ NDIMS:0L, NVARS:0L, NGATTS:0L, RECDIM:0L }
           说明:Ndims 这个 NetCDF 文件定义维度的数目;
                       Nvars 这个 NetCDF 文件定义变量的数目;
                       Ngatts 这个 NetCDF 文件定义全局属性的数目;
                       RecDim The ID of the unlimited dimension, if there is one, for this NetCDF file. If there is no unlimited dimension, RecDim is set to -1.
           语法:Result = NCDF_INQUIRE(Cdfid)
  • NCDF_VARINQ:返回变量信息
         【函数】返回值是一个结构体,{ NAME:"", DATATYPE:"", NDIMS:0L, NATTS:0L, DIM:LONARR(NDIMS) }
           说明:Name 变量的名称;
                       DataType 变量数据类型,'BYTE', 'CHAR', 'INT', 'LONG', 'FLOAT', or 'DOUBLE';
                       Ndims 维度的数目;
                       Natts 给这个变量分配属性的数目;
                       Dim A vector of the dimension IDs for the variable dimensions.
           语法:Result = NCDF_VARINQ(Cdfid, Varid)
    Function ncdf_vardir, cdfid
    ;- Check arguments
    if(n_params() ne ) then $
    message, 'Usage: result=ncdf_vardir(cdfid)'
    if(n_elements(cdfid) eq ) then $
    message, 'Argument cdfid is undefined' ;- Set default return value
    varnames='' ;- Get file information
    fileinfo = ncdf_inquire(cdfid)
    nvars=fileinfo.nvars ;- If variables were found, get variable names
    if(nvars gt ) then begin
    varnames = strarr(nvars)
    for index = 0L, nvars - 1L do begin
    varinfo = ncdf_varinq(cdfid, index)
    varnames[index] = varinfo.name
    endfor
    endif ; -return the result
    return, varnames
    end
    IDL> cdfid = ncdf_open('sao.nc')
    IDL> varnames = ncdf_vardir(cdfid)
    IDL> help, varnames
    VARNAMES STRING = Array[]
    IDL> print, varnames
    id region time lat lon elev T TD PSL ALTIM SPD
    DIR GUST WX ZCL CC cloudtype VIS Ptend delP
    PRECIP reftime_PRECIP Tmax Tmin remarks
  • NCDF_ATTNAME:返回一个属性名称。
         【函数】返回属性名称,如果没有,就返回空。
           语法:Result = NCDF_ATTNAME( Cdfid [, Varid] , Attnum [, /GLOBAL])
  • NCDF_CREATE:创建一个 NetCDF 文件。
         【函数】创建成功的话就会返回 NetCDF ID 值。文件自动转入定义模式(define mode),意味着新的变量、属性和维度可以加入文件中。
           语法:Result = NCDF_CREATE( Filename [, /CLOBBER | /NOCLOBBER] [, /NETCDF3_64BIT] [, /NETCDF4_FORMAT] )
           说明:CLOBBER 设置此关键字,并且文件存在,那么在创建新的版本之前直接擦除文件内容;
                       NOCLOBBER 设置此关键字,只有不存在此文件的情况下才能创建成功,否则报错。
  • NCDF_DIMDEF:创建一个维度。
         【函数】如果成功,返回维度的 ID 值。      
           语法:Result = NCDF_DIMDEF( Cdfid, DimName, Size [, /UNLIMITED] )
           说明:DimName 被定义纬度的字符串名称;
                       Size 维度的大小。可以用任何数量的表达式来表达。如果使用了关键字 UNLIMITED,Size 相当于无效;
                       UNLIMITED 设置此关键字可以创建一个无限大小的维度。
  • NCDF_VARDEF:创建一个变量。
         【函数】如果成功,返回变量的 ID 值。如果不能创建这个新的变量,就会返回-1。
           语法:Result = NCDF_VARDEF( Cdfid, Name [, Dim] [, /BYTE | , /CHAR | , /DOUBLE | , /FLOAT | , /LONG | , /SHORT] [, CHUNK_DIMENSIONS] [, /CONTIGUOUS] [, GZIP=value] [, /SHUFFLE] [, /STRING] [, /UBYTE] [, /UINT64] [, /ULONG] [, /USHORT])
           说明:如果类型关键字没有数据,默认使用 FLOAT;
                       Dim 包括变量维度的 dimension IDs。如果 ID 是无限大小的,那必须放在数组的最右面。如果没有设置 Dim,变量默认为一个标量。
  • NCDF_ATTPUT:写入属性数据。
           语法:NCDF_ATTPUT, Cdfid [, Varid] , Name , Value [, /GLOBAL] [, LENGTH=value] [, /BYTE | , /CHAR | , /DOUBLE | , /FLOAT | , /LONG | , /SHORT] [, /STRING] [, /UBYTE] [, /UINT64] [, /ULONG] [, / USHORT]
           说明:GLOBAL 设置此关键字去创建全局属性。
  • NCDF_CONTROL:开始或结束定义模式。
           语法:NCDF_CONTROL, Cdfid [, /ABORT] [, /ENDEF] [, /FILL | , /NOFILL] [, /NOVERBOSE | , /VERBOSE] [, OLDFILL=variable] [, /REDEF] [, /SYNC]
           说明: 设置此关键字可以将一个打开的 NetCDF 文件结束定义模式(define mode),进入数据模式(data mode)文件只有在数据模式下才能写入变量。
  • NCDF_VARPUT:写入变量数据。
           语法:NCDF_VARPUT, Cdfid, Varid, Value [, COUNT=vector] [, OFFSET=vector] [, STRIDE=vector]

【179】IDL 读写 NetCDF 文件的更多相关文章

  1. 【180】IDL 读写 HDF 文件

    HDF(Hierarchical Data Formats)数据格式由 NCSA 开发.HDF 提供了大量的数据模式,包括多维数组.表格.图像.注解和调色板.在下面的章节中,将描述 HDF 科学数据系 ...

  2. 【224】◀▶ IDL NetCDF 文件操作说明

    参考:I/O - NetCDF Routines —— NetCDF 操作函数 01   NCDF_OPEN 打开一个 NetCDF 文件. 02   NCDF_CLOSE 关闭一个 NetCDF 文 ...

  3. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  4. 用opencsv文件读写CSV文件

    首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...

  5. 在.net中读写config文件的各种方法

    阅读目录 开始 config文件 - 自定义配置节点 config文件 - Property config文件 - Element config文件 - CDATA config文件 - Collec ...

  6. MFC vs2012 Office2013 读写excel文件

    近期在忙一个小项目(和同学一起搞的),在这里客户要求不但读写txt,而且可以读写excel文件,这里本以为很简单,结果...废话少说,过程如下: 笔者环境:win7 64+VS2012+Office2 ...

  7. Java读写资源文件类Properties

    Java中读写资源文件最重要的类是Properties 1) 资源文件要求如下: 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置.  注 ...

  8. c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)

    c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...

  9. 用Python读写Excel文件(转)

    原文:google.com/ncr 虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TA ...

随机推荐

  1. apache cgi 模块安装

    apache安装,请参照:http://httpd.apache.org/docs/2.4/ 安装系统: Fedora release 21 (Twenty One)  (x64) 版本:Server ...

  2. Linux MTD (Memory Technology Device) subsystem analysis -For Atheros char device

    Linux MTD (Memory Technology Device) subsystem analysis For Atheros char device 读了Linux MTD 源代码分析 对这 ...

  3. http的N种请求

    GET通过请求URI得到资源 POST,用于添加新的内容 PUT用于修改某个内容 DELETE,删除某个内容 CONNECT,用于代理进行传输,如使用SSL OPTIONS询问可以执行哪些方法 PAT ...

  4. iOS 混合变换旋转 CGAffineTransform 的使用

    在ios 中, Core Graphics 提供了一系列的函数可以在一个变换的基础上做深层次的变换,如果做一个既要缩放又要旋转的变换,以下的方法比较实用. CGAffineTransformScale ...

  5. Flatten Binary Tree to Linked List (DFS)

    Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...

  6. JAVA_构造方法

    构造方法: 作用:是给对象的数据进行初始化用的. 特点:1 必须和类的名字一样. 2 和真正的方法是有所不同的,构造方法是没有返回值的类型的 eg:   方法:public  void  User ( ...

  7. 阿里oss上传图片react组件alioss-react,vue组件alioss-vue (不用我先收藏着,后端看下前端处理方法)

    1.介绍 最近开发了一个项目,其中需要一个上传图片到阿里云的 oss 上面,就是上传图片到阿里云的 oss 上面. 因为之前开发过 vue 的阿里云 oss 上传,所以直接复制粘 vue 的组件. 因 ...

  8. FlashFXP绿色版

    http://www.xdowns.com/soft/1/98/2006/Soft_30927.html

  9. Import Items – Validation Multiple Languages Description

    ð  提交标准请求创建和更新物料,因语言环境与处理次序方式等因素,造成物料中英(更多语言)描述和长描述混乱刷新. 症状: >>> Submit Standard Open Inter ...

  10. 扫描控件Web在线Applet

    基于JAVAEE的B/S架构由于java语言的跨平台性 所以操控Window客户端资源能力有限, 目前比较流行是用其他语言如Delphi,VB,C++开发客户端控件 然后再html中用js调用.    ...