前言
笔者最近使用模式场的数据时, 遇到了大量的grib2格式的数据, 用NCL进行文件I/O提取廓线数据尽管方便,但是效率极其低下,比如做一个80x60格点的廓线数据提取写入ASCII编码文件,花了4个小时。
因此由于要进行RTTOV传输模式的研究,必须要进行大规模的廓线数据处理,决心转战GRIB2-API的FORTRAN API, 据称可以大大提高文件I/O效率
GRIB-API 由 ECMWF 开发,放出官方主页:
https://confluence.ecmwf.int//display/GRIB/Releases
话不多说,我们开始操作吧
一.JPEG 依赖库
要读取GRIB文件中的数组,我们要先安装一个JPEG库, 有两种安装方式
- 编译安装
官网, 编译安装比较简单,就不细说了
http://www.ijg.org/
- 或者使用Ubuntu自带的库包管理系统
$ sudo apt-get install libjpeg-dev
笔者使用的是前者(编译安装),安装目录在/usr/local/jpeg-9/下
二. GRIB API without jasper
下载到的包是release版本 grib_api-1.27.0-Source.tar.gz
在目录下解压
$ tar -zxvf grib_api-1.27.0-Source.tar.gz
查看以下Readme文件,按照提示操作:
$ mkdir build
$ cd build
$ sudo cmake ../grib_api-1.27.0-Source -DCMAKE_INSTALL_PREFIX=/usr/local/gribapi -DNETCDF_PATH=/usr/local/NETCDF -DJPEG_LIBRARY=/usr/local/jpeg-9/lib -DJPEG_INCLUDE_DIR=/usr/local/jpeg-9/include -DOPENJPEG_LIBRARY=/usr/local/openjpeg/lib -DOPENJPEG_INCLUDE_DIR=/usr/local/openjpeg/include
如果报错没有cmake工具,不妨 apt-get 安装一下
Cmake声明依赖环境路径的方式比较特殊,要在前面加一个“D”
$ make
$ ctest
$ sudo make install
ctest时可能测试需要下载一些网络文件,会比较慢,需要耐心等待,出现download测试点FAIL也不用担心,主要是我们伟大的墙....
安装完后,我们看看bin目录下有这些可执行文件:
-rwxr-xr-x 1 root root 18640 Sep 1 21:08 big2gribex*
-rwxr-xr-x 1 root root 24240 Sep 1 21:08 gg_sub_area_check*
-rwxr-xr-x 1 root root 876 Sep 1 21:00 grib1to2*
-rwxr-xr-x 1 root root 26488 Sep 1 21:08 grib2ppm*
-rwxr-xr-x 1 root root 20960 Sep 1 21:08 grib_add*
-rwxr-xr-x 1 root root 32272 Sep 1 21:08 grib_cmp*
-rwxr-xr-x 1 root root 581880 Sep 1 21:08 grib_compare*
-rwxr-xr-x 1 root root 530800 Sep 1 21:08 grib_convert*
-rwxr-xr-x 1 root root 523544 Sep 1 21:08 grib_copy*
-rwxr-xr-x 1 root root 18880 Sep 1 21:08 grib_corruption_check*
-rwxr-xr-x 1 root root 31416 Sep 1 21:08 grib_count*
-rwxr-xr-x 1 root root 522256 Sep 1 21:08 grib_debug*
-rwxr-xr-x 1 root root 20920 Sep 1 21:08 grib_distance*
-rwxr-xr-x 1 root root 526328 Sep 1 21:08 grib_dump*
-rwxr-xr-x 1 root root 46048 Sep 1 21:08 grib_error*
-rwxr-xr-x 1 root root 524768 Sep 1 21:08 grib_filter*
-rwxr-xr-x 1 root root 526808 Sep 1 21:08 grib_get*
-rwxr-xr-x 1 root root 539632 Sep 1 21:08 grib_get_data*
-rwxr-xr-x 1 root root 22056 Sep 1 21:08 grib_histogram*
-rwxr-xr-x 1 root root 525112 Sep 1 21:08 grib_index_build*
-rwxr-xr-x 1 root root 20280 Sep 1 21:08 grib_info*
-rwxr-xr-x 1 root root 527624 Sep 1 21:08 grib_keys*
-rwxr-xr-x 1 root root 29312 Sep 1 21:08 grib_list_keys*
-rwxr-xr-x 1 root root 540416 Sep 1 21:08 grib_ls*
-rwxr-xr-x 1 root root 36472 Sep 1 21:08 grib_moments*
-rwxr-xr-x 1 root root 25880 Sep 1 21:08 grib_packing*
-rwxr-xr-x 1 root root 24768 Sep 1 21:08 grib_parser*
-rwxr-xr-x 1 root root 20312 Sep 1 21:08 grib_repair*
-rwxr-xr-x 1 root root 525008 Sep 1 21:08 grib_set*
-rwxr-xr-x 1 root root 40616 Sep 1 21:08 grib_to_json*
-rwxr-xr-x 1 root root 33584 Sep 1 21:08 tigge_accumulations*
-rwxr-xr-x 1 root root 275712 Sep 1 21:08 tigge_check*
-rwxr-xr-x 1 root root 31344 Sep 1 21:08 tigge_name*
-rwxr-xr-x 1 root root 24688 Sep 1 21:08 tigge_split*
添加到环境变量
export PATH=/usr/local/gribapi/bin:$PATH
笔者对安装好的GRIB API做了一个测试:
$ grib_dump rmf.gra.2018070800003.grb2 > rmf.gra.2018070800003.grb2.dumped
发现有大量报错提示JPEG库没有安装
JPEG库本质上是一个图像encoding/decoding库包,依赖该库包编译的GRIB_API才能对编码的数据进行读写。正因为读写GRIB数据需要解码/编码,因此速度非常慢
原来笔者需要读取的数据打包格式是grid_jpeg, 如果不安装支持JPEG那么就无法正常解码并读取这些数据,因此务必要在GRIB_API编译安装时依赖JPEG库
JPEG库有两种选择
- OPENJPEG (<= 1.5.2)
- JASPER
笔者这里选择了JASPER
三 JASPER 库的编译安装
jasper 官网
http://www.ece.uvic.ca/~frodo/jasper/
编译安装, 按照Readme中的说明,笔者使用CMAKE工具
$ mkdir build
$ cd build
$ cmake ../jasper-2.0.14/ -DCMAKE_INSTALL_PREFIX=/usr/local/jasper
$ make
$ ctest
$ sudo make install
ctest 通过即可
四. GRIB API with jasper
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
找了很多方案使用Cmake编译GRIBAPI 依赖 jasper 库
CMake 监测 Jasper 库连接会有一些问题,原因不明, 笔者暂时没有时间仔细研究,欢迎评论补充
$ cmake ../grib_api-1.27.0-Source -DCMAKE_INSTALL_PREFIX=/usr/local/gribapi -DJASPER_LIBRARIES=/usr/local/jasper/lib -DJASPER_INCLUDE_DIR=/usr/local/jasper/include -DJPEG_LIBRARIES=/usr/local/jpeg-9/lib
有几种报错:
-
- 找不到头文件
fatal error: jasper/jasper.h: No such file or directory
compilation terminated.
src/CMakeFiles/grib_api.dir/build.make:4502: recipe for target 'src/CMakeFiles/grib_api.dir/grib_jasper_encoding.c.o' failed
make[2]: *** [src/CMakeFiles/grib_api.dir/grib_jasper_encoding.c.o] Error 1
CMakeFiles/Makefile2:1144: recipe for target 'src/CMakeFiles/grib_api.dir/all' failed
make[1]: *** [src/CMakeFiles/grib_api.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
那是因为你指定的include头文件位置有一个jasper文件夹隐藏在下面, include目录下没有现成的头文件, 解决方案之一是把藏在jasper文件夹下的.h全部拎出来
-
- 版本定义不兼容
.../GRIB_API/grib_api-1.27.0-Source/src/grib_jasper_encoding.c: In function ‘grib_jasper_encode’:
.../GRIB_API/grib_api-1.27.0-Source/src/grib_jasper_encoding.c:113:10: error: ‘jas_image_t {aka struct}’ has no member named ‘inmem_’
image.inmem_ = 1;
^
src/CMakeFiles/grib_api.dir/build.make:4502: recipe for target 'src/CMakeFiles/grib_api.dir/grib_jasper_encoding.c.o' failed
make[2]: *** [src/CMakeFiles/grib_api.dir/grib_jasper_encoding.c.o] Error 1
CMakeFiles/Makefile2:1144: recipe for target 'src/CMakeFiles/grib_api.dir/all' failed
make[1]: *** [src/CMakeFiles/grib_api.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
参考 Github 上的 一个 issue
https://github.com/cloudruninc/wps/issues/5
我们认为是版本升级后和旧版本的不兼容问题,结构分支已经废弃了, 注释掉这行源码就行
修改 : /src/grib_jasper_encoding.c 注释掉 113行
- 找不到库
3.1 cmake时
WARNING: Target "grib_api" requests linking to directory "/usr/local/jasper/lib". Targets may link only to libraries. CMake is dropping the item.
WARNING: Target "grib_api" requests linking to directory "/usr/local/jpeg-9/lib". Targets may link only to libraries. CMake is dropping the item.
WARNING: Target "grib_api" requests linking to directory "/usr/local/jasper/lib". Targets may link only to libraries. CMake is dropping the item.
WARNING: Target "grib_api" requests linking to directory "/usr/local/jpeg-9/lib". Targets may link only to libraries. CMake is dropping the item.
WARNING: Target "grib_keys" requests linking to directory "/usr/local/jasper/lib". Targets may link only to libraries. CMake is dropping the item.
WARNING: Target "grib_keys" requests linking to directory "/usr/local/jpeg-9/lib". Targets may link only to libraries. CMake is dropping the item.
3.2 make时
undefined references to: 'jas_stream_memopen', 'jpc_decode', 'jas_matrix_create', 'jas_image_destroy', 'jpc_decode'
ECMWF 的 FAQ中提到了这个问题
https://confluence.ecmwf.int/display/OIFS/FAQ%3A+Frequently+Asked+Questions
这就是刚刚笔者说的找不到连接库的问题, 不是很明确Cmake有什么问题
添加 LD_LIBRARY_PATH 不 work
欢迎补充,因此放弃了cmake
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
暂时就用./configure测试,发现没有问题
$ cd grib_api-1.27.0-Source
$ ./configure --prefix=/usr/local/gribapi_withjasper --with-jasper=/usr/local/jasper
$ make
$ sudo make install
五. pygrib 安装
这一部分主要参考一篇 CSDN 的文章
https://blog.csdn.net/learn_tech/article/details/78957655
先在环境下安装 matplotlib
笔者用conda 环境管理
$ conda install matplotlib
$ conda install numpy
$ conda install basemap
$ conda install pyproj
$ conda install geos
环境搭建好后主要看 pygrib 安装
pygrib 有超出conda环境的依赖关系, 不能通过conda直接安装, 需要指定依赖关系后编译安装
去github下载源码
https://github.com/jswhit/pygrib/releases
笔者下载的是2.0.3版本
$ tar -zxvf pygrib-2.0.3.tar.gz
$ cd pygrib-2.0.3
$ cp setup.cfg.template setup.cfg
修改配置文件
改完后编译安装
$ python setup.py build
$ python setup.py install
$ python test.py
打完收工, 测试成功。
下期讲GRIB API的基本使用。
参考都放在随笔中, 恕不在结尾另外列出