由于项目是关于气象的。所以需要做这个关于气象的东西。
得知netcdf是网络通用格式文件,于是老板叫找个python下面的有关这个的读取
无奈是netcdf支持c, fortan ,c++就是没有python的包
于是在github里面去找,找到一个关于python的工具于是就成功了。这里记录下安装的坑吧。总共花了2天时间,不断龟速下载和安装尝试现在总结下方法。
1. 首先是去网站里面
http://www.unidata.ucar.edu/downloads/netcdf/index.jsp 这个网址里面下载netcdf for c 稳定版
安装方法:
tar -zxvf netcdf***.tar.gz cd netcdf* mkdir /usr/local/netcdf ./configure --prefix=/usr/local/netcdf --libdir=/usr/lib/ --includedir=/usr/lib/ --sharedstatedir=/usr/share --bindir=/usr/bin/ 如果装了intel编译器,会提示math.h的错误,加上CC=icc make & make check make install
去百度hdf5下载一个18.0+版本的按下面方法安装,这个最难装经常报错,实在不行直接先不管,这里教程有很多步骤可能是重复的,因为我安装的方法很多种已经记不清楚了,。反正按这个步骤来一遍 基本上能成功
tar -zxvf hdf5***.tar.gz cd hdf5* mkdir /usr/local/hdf5 ./configure --prefix=/usr/local/hdf5 --libdir=/usr/lib/ --includedir=/usr/lib/ --sharedstatedir=/usr/share --bindir=/usr/bin/ make & make check make install再安装zlib
tar -zxvf zlib***.tar.gz cd zlib* mkdir /usr/local/zlib ./configure --prefix=/usr/local/zlib --libdir=/usr/lib/ --includedir=/usr/lib/ --sharedlibdir=/usr/share 其中 --libdir=/usr/lib/ --includedir=/usr/lib/一定写上,把库文件与头文件装在系统默认搜寻的地方,免得后面设置LD_LIBRARY_PATH ,如果不懂可用./configure --help 查看 make & make check make install
3. 第2步是第一步的基础,前两部成功后再开始安装关于python的。
https://github.com/gersolar/netcdf
这个git上面的工具是我试过能够成功的,根据里面的readme.md 方法
先
$ pip install netcdf这里如果报denied permisson之类的可能是因为没用管理员权限
ubuntu下面用sudo pip install netcdf
这一步速度可鞥会很慢,就等等。也可以加提速镜像
sudo pip install netcdf -i http://e.pypi.python.org/simple
这里反正要等很久。也是最关键的一部 。 可能1,2两步的东西这里也会自动安装,我想前面安装了,他会自动跳过吧
4. 前面都好了。就把https://github.com/gersolar/netcdf 这个clone下来 不会的请先学git使用。
然后
$ make deploy或者
$ make ubuntu deploy
CDL全称为network Common data form Description Language,它是用来描述netcdf文件 的结构的一种语法格式。它包括前面所说的三种netcdf对象(变量、维、属性)的具体定义。 看一个具体例子(这个例子cdl文件是从netcdf教程中的2.1 节The simple xy Example摘出来的) netcdf simple_xy { dimensions: x = 6 ; y = 12 ; variables: int data(x, y) ; data: data = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71 ; } 上面的代码定义了一个符合netcdf格式的结构simple_xy, 这个结构包括三个部分 1、维的定义,以dimensions:关键字开头 dimensions: x = 6 ; y = 12 ; 定义了两个轴(或者说两维),名字分别为x和y,x轴的长度(准确的说是坐标点的个数)为6, y轴的长度为12。 2、变量的定义:以variables:开头 variables: int data(x, y); 定义了一个以x轴和y轴为自变量的函数data,数学公式就是f(x,y)=data; 注意维出现的顺序是有序的,它决定data段中的具体赋值结果. 3、数据的定义,以data:开头 data: data = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71 ; 这个段数据用数学的函数公式f(x,y)=data来看, 就是 x=0,y=0时,data = 0; x=0,y=1时,data = 1; x=5,y=11是,data=71; 要注意的是, 1、赋值顺序: 我们给出的是c格式的cdl文件,因此这里的赋值顺序和c语言中的一致,也就是通常所说的“行式赋值”, 而fortran语言中则是“列式赋值”,因此在fortran格式的cdl文件中,data段的数值顺序和这里正好 行列互换。 2、自变量的默认取值和坐标变量 如果只给出维的长度,那么维的值默认从0开始,然后自动加1,到(长度-1)停止, 很多情况下我们要自己给出每个点的坐标值,这时就需要用到netcdf里的坐标变量 "coordinate varibles":增加一个和只和维相关的一元函数(自变量)并给出它的取值范围。 比如下面的cdl文件(摘自netcdf教程中的2.2 The sfc pres temp Example) netcdf sfc_pres_temp { dimensions: latitude = 6 ; //纬度轴 longitude = 12 ; //经度轴 variables: float latitude(latitude) ; //坐标变量,存储具体纬度 latitude:units = "degrees_north" ; float longitude(longitude) ; //坐标变量,存储具体纬度 longitude:units = "degrees_east" ; float pressure(latitude, longitude) ; //某个点(经度和纬度的交点)的大气压值 pressure:units = "hPa" ; //大气压的单位为 float temperature(latitude, longitude) ; //某个点(经度和纬度的交点)的温度值 temperature:units = "celsius" ; //温度的单位为 data: latitude = 25, 30, 35, 40, 45, 50 ; longitude = -125, -120, -115, -110, -105, -100, -95, -90, -85, -80, -75, -70 ; pressure = 900, 906, 912, 918, 924, 930, 936, 942, 948, 954, 960, 966, 901, 907, 913, 919, 925, 931, 937, 943, 949, 955, 961, 967, 902, 908, 914, 920, 926, 932, 938, 944, 950, 956, 962, 968, 903, 909, 915, 921, 927, 933, 939, 945, 951, 957, 963, 969, 904, 910, 916, 922, 928, 934, 940, 946, 952, 958, 964, 970, 905, 911, 917, 923, 929, 935, 941, 947, 953, 959, 965, 971 ; temperature = 9, 10.5, 12, 13.5, 15, 16.5, 18, 19.5, 21, 22.5, 24, 25.5, 9.25, 10.75, 12.25, 13.75, 15.25, 16.75, 18.25, 19.75, 21.25, 22.75, 24.25, 25.75, 9.5, 11, 12.5, 14, 15.5, 17, 18.5, 20, 21.5, 23, 24.5, 26, 9.75, 11.25, 12.75, 14.25, 15.75, 17.25, 18.75, 20.25, 21.75, 23.25, 24.75, 26.25, 10, 11.5, 13, 14.5, 16, 17.5, 19, 20.5, 22, 23.5, 25, 26.5, 10.25, 11.75, 13.25, 14.75, 16.25, 17.75, 19.25, 20.75, 22.25, 23.75, 25.25 对于上面的数据,就是 latitude = 25,longitude = -125时,pressure = 900,temperature = 9; latitude = 25,longitude = -120时,pressure = 906,temperature = 10.5; 以此类推。
把上面的第一个列子保存为 *.cdl文件
然后在命令行里面
ncgen -o simple_xy.nc simple_xy.cdl生成netcdf格式文件simple_xy.nc
在命令行下执行ncdump simple_xy.nc,这时屏幕的输出和simple_xy.cdl内容完全一样。说明 我们的文件读写操作都是正确的。
$python
然后
>>>
from netCDF4 import Dataset f = Dataset('**刚才保存的名字.nc') v = f.variables['data']
如果有数据,就说明成功了。enjoy it !