解读netCDF文件(转)

    netCDF数据格式
    netCDF缺点:
    1、只能有一个维可变化,因此非方型的数组难以存储
    2、虽然说是完全自说明的,但是一个变量仅能有几种基本类型的属性变量,复杂的属性变量(如像C++中的类)无法建立,故对于复杂的原数据也是无法自说明的
    3、不支持嵌套结构
    4、不支持同时访问,一个文件一次只能由一个用户访问,不支持多用户同时访问
     
    netCDF数据模型
    一个netCDF数据集包含维、变量和属性三种描述类型,每种类型都会被分配一个名字和一个ID,这些类型共同描述了一个数据集,netCDF库可以同时访问多个数据集,这时就是用ID来识别的。
    另外,这三种类型的命名是有规则的,只能由字母组成(再加上’_',’.',’-'),而且字母是大小写敏感的,即大小写不一样时是不同的,例如,temperature和_temp都是可以的,而Temp和temp是两个不同的东西
     
    netCDF数据集的组成
     
    维(dimensions)
    定义方法:维的名字 = 维的大小
    例如:
    我们要定义经度维,这个经度维含有5个经度,那么可以定义
    lon = 5
    定义高度维,如含有19个高度值,那么定义
    level = 19
    另外在一个数据集中,可以且最多可以含有一个无限大小的维,可以把它定义为unlimited。例如时间,我们一时不确定时间具体会有多少,那么我们就把时间定义为一个无限的维(unlimited dimension),如果一个变量用有一个无限的维时,那么这个变量可以无限的增长。
    time = unlimited
    无限的维也称为记录维(record dimension),因为netCDF系统内部是用这个维作为ID标示记录的。
     
    变量(variable)
    变量用来储存数据,使用前必须定义,包括变量的数型、维数、属性等等
    数型:就是数据的类型,一般有整数型、实数型等,跟C语言中的变量类型很相似,例如,可以定义:
    float temperature(time, lat, lon);
    int lat(lat);
    其中温度是浮点型,纬度是整型
    维数:这个应该由前面已经定义好的维来定义,当一个变量没有维的定义时,很显然,这个变量只储存一个值,那么这个变量是一个标量,如果有了维的定义,那么这个变量变成类似数组的东西,可以储存多个值。
    float temperature(time, lat, lon);
    括号里面的就是维
     
    坐标变量(coordinate variables)
    就是一系列变量,他们的名字跟维的名字是一样的,维的定义只说明了维的大小,这里可以分别指定维具体取什么值,例如高度维我们定义有4个,那么我们可以分别把这4个高度定为1000、850、700、500这4个值,但是在内部还是以原始的方式表示,如C语言数组起始的第一个元素的索引是0,而FORTRAN中是1。
    使用坐标变量的意义是,我们可以通过一些方法,用这个值来索引得我们的数据,例如netCDF库中提供的一些函数,很可能就是使用这个值来索引,NCL(NCARG Command Language)中也是直接用变量坐标的取值来索引的,例如我们要取1000高度上的数据,直接用1000来索引,而不需要像C语言的数组那样有特定的索引,必需从0开始,当然,这必须通过一些特定的函数来实现,用法如:
    variables:
        int level(level);
    data:
        level = 1000, 850, 700, 500;
     
    属性(attributes)
    变量属性(variable attributes)
    一个变量可以拥有很多属性,变量的属性一般是用来说明变量本身的,如对单位、取值范围的说明等,如:
    int lat(lat);
        lat:units = "degrees_north";
    这里说明经度的单位是度,向北递增,又如:
    float rh(time,lat,lon);
        rh:long_name = "relative humidity";
        rh:valid_range = 0.0, 1.0;
    这里说明rh的全名是relative humidity,其有效范围是0.0到1.0,注意这里的属性的值可以有多个,即可以是单一的值(标量),也可以是多个值(矢量),但是这时矢量只允许有一维。
    全局属性(global attributes)
    用来说明整个数据集的一些信息,和变量的attributes一样,但是定义时,前面不加变量名
    :attribute_name = list_of_value;
    如:
    :dataset_name = "meteorology dataset";
     
    数据(Data)
    netCDF有6种原始的外部数据类型:
    char      8-bit
    byte      8-bit integers
    short    16-bit signed integers
    int      32-bit signed integers
    float    32-bit IEEE floating-point
    real     32-bit IEEE floating-point
    double   64-bit IEEE floating-point
     
    CDL notation
    CDL表示法是一种表示netCDF文件格式的文本规范,以下是一个范例,非常容易理解
    netcdf example_1 { // example of CDL notation for a netCDF dataset
        dimensions: // dimension names and lengths are declared first
            lat = 5, lon = 10, level = 4, time = unlimited;
        variables: // variable types, names, shapes, attributes
            float temp(time,level,lat,lon);
            temp:long_name = "temperature";
            temp:units = "celsius";
            float rh(time,lat,lon);
                rh:long_name = "relative humidity";
                rh:valid_range = 0.0, 1.0; // min and max
            int lat(lat), lon(lon), level(level);
                lat:units = "degrees_north";
                lon:units = "degrees_east";
                level:units = "millibars";
            short time(time);
                time:units = "hours since 1996-1-1";
        // global attributes
        :source = "Fictional Model Output";
        data: // optional data assignments
            level = 1000, 850, 700, 500;
            lat = 20, 30, 40, 50, 60;
            lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;
            time = 12;
            rh =.5,.2,.4,.2,.3,.2,.4,.5,.6,.7,
                .1,.3,.1,.1,.1,.1,.5,.7,.8,.8,
                .1,.2,.2,.2,.2,.5,.7,.8,.9,.9,
                .1,.2,.3,.3,.3,.3,.7,.8,.9,.9,
                0,.1,.2,.4,.4,.4,.4,.7,.9,.9;
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值