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 <anonymous>}’ 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的基本使用。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容