GRIB API 的安装和使用(一)

前言

笔者最近使用模式场的数据时, 遇到了大量的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库, 有两种安装方式

  1. 编译安装
    官网, 编译安装比较简单,就不细说了

http://www.ijg.org/

  1. 或者使用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文件,按照提示操作:


readme_gribapi.PNG
$ 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”

未检测到NETCDF安装.PNG
$ 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库

3-grib_list.PNG

JPEG库有两种选择

  1. OPENJPEG (<= 1.5.2)
  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

有几种报错:

    1. 找不到头文件

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全部拎出来

    1. 版本定义不兼容

.../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- comment out.PNG
  1. 找不到库
    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

3-FAQ.PNG

这就是刚刚笔者说的找不到连接库的问题, 不是很明确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 

修改配置文件

setup.config.PNG

改完后编译安装

$ python setup.py build
$ python setup.py install
$ python test.py
pygrib 安装成功.PNG
test passed.PNG

打完收工, 测试成功。
下期讲GRIB API的基本使用。


参考都放在随笔中, 恕不在结尾另外列出

你可能感兴趣的:(GRIB API 的安装和使用(一))