go-netcdf简单使用记录
使用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,netcdf
ArchLinux等中。您还可以从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有点复杂。
首先,这个包没有使用二维、三维这样的数组去存放多维度的数据,而是使用的一维数组。
思路:
- 打开一个写入流
- 写入全局属性信息(获取属性的数据类型,然后写入)
- 循环写入变量信息(注意是循环)
- 创建变量所对应的维度信息,添加到写入流
- 创建变量,将变量的数据类型和维度信息传入进去
- 将变量的属性信息写入进去
- 根据变量的数据类型,将变量值得一维数组写入进行
- 关闭写入流