​ 使用netcdf的第三方封装库:github.com/fhs/go-netcdf

1、简介:

软件包netcdf是netCDF C库的Go绑定。如果在C库中启用了netCDF 4支持,则此软件包支持netCDF版本3和版本4。

2、安装:

首先,请确保您已经安装了netCDF C库。大多数Linux发行版都提供了一个软件包:libnetcdf-dev在Ubuntu/Debian,netcdfArchLinux等中。您还可以从Unidata下载源代码,进行编译和安装。

然后,要安装go-netcdf,请运行:

$ go get github.com/fhs/go-netcdf/netcdf

3、个人使用小总结

​ 开始写文档才注意到作者已经提供了netcdf的使用环境简介。我自己测试时使用的是自己2年前基于centos7做的一个镜像,明天去了公司有空了测试一下作者提供的方法,测试成功将自己的Dockerfile文件奉上。

3.1、netcdf 文件格式简介

netcdf是一种气象领域存储数据专用的格式,可以将3千万个点的数据存储到一个120m左右的文件中。

(个人总结,有不对的地方,还请发邮件1042038872@qq.com指正,多谢)

netcdf的格式中涉及到几个概念:

  • 维度
  • 属性
  • 变量

可以用一个形象的比喻来解释这几个变量。

如何在地球上确定你的地理位置,各种信息。

3.1.1、维度

​ 在nc文件中根据一个或多个维度的信息获取变量的值。

​ 要在地球上确定你的地理位置,你可能第一时间想到的是根据 经度纬度 进行确定,如果你此刻正在坐飞机,那么是不是最好再加一个 时间

​ 根据时间经度纬度 就基本可以确定你在地球上的大概位置了。这里的时间经度纬度就是在气象数据中的维度概念。

3.1.2、属性

​ 在nc文件中对文件以及变量的说明。

​ 属性分为 全局属性局部属性

全局属性:在这个比喻中可以不恰当的可以说成是:地球的基础信息,比如地球的直径,自转等

局部属性:指的是在变量中的属性

3.1.3、变量

​ 每一个变量都有自己特有的属性信息,可以根据维度信息获取对应变量的值。

变量在这个小的比喻中,可以指:人,飞机等。用来描述人所处位置的时间、经度、维度就是维度信息、用来描述人的身高 单位、体重单位等基础信息就是属性信息,具体的身高值,体重值可以看成是变量的值。

比喻可能有些不恰当,具体的可以参考百度等第三方说明。

3.2、使用nc文件的基础环境

​ 使用nc文件要安装unidata提供的软件环境。详情自己去百度

3.2.1、golang语言使用nc文件

​ 由于unidata官方并没有提供goalng语言的包,所以要使用golang去处理nc文件,需要调用unidata官方的c/c++的包。我这里采用的是github.com/fhs/go-netcdf/netcdf

3.2.2、python语言使用nc文件

​ 直接安装python的相关包就可以

3.2.3、java语言使用nc文件

​ maven仓库中搜索netcdf,好像我当时使用的是netcdf4的一个包

3.3、go-netcdf包的使用思路-读

读nc文件很简单

3.3.1、打开nc文件

3.3.2、获取全局属性信息的数量,然后根据角标进行遍历属性信息

3.3.3、获取全局变量的数量

  • 根据角标获取到某一个变量
  • 获取变量的名称
  • 获取变量的数据类型
  • 获取变量的维度信息(遍历获取每个维度的名称和大小)
  • 获取变量的属性信息(遍历获取每个属性的名称和值信息)
  • 获取变量的长度,然后创建同等大小的数组
  • 根据变量的数据类型,获取变量的值,并将值读到刚刚创建的数组中
  • 关闭读取流

备注:是不是发现并没有去读取全局维度信息,其实维度信息是根据所有变量提取出来,然后生成的(吹)

3.4、go-netcdf包的使用思路-写

写nc有点复杂。

首先,这个包没有使用二维、三维这样的数组去存放多维度的数据,而是使用的一维数组。

思路:

  • 打开一个写入流
  • 写入全局属性信息(获取属性的数据类型,然后写入)
  • 循环写入变量信息(注意是循环)
  • 创建变量所对应的维度信息,添加到写入流
  • 创建变量,将变量的数据类型和维度信息传入进去
  • 将变量的属性信息写入进去
  • 根据变量的数据类型,将变量值得一维数组写入进行
  • 关闭写入流