前言
筆者最近使用模式場(chǎng)的數(shù)據(jù)時(shí), 遇到了大量的grib2格式的數(shù)據(jù), 用NCL進(jìn)行文件I/O提取廓線數(shù)據(jù)盡管方便,但是效率極其低下,比如做一個(gè)80x60格點(diǎn)的廓線數(shù)據(jù)提取寫入ASCII編碼文件,花了4個(gè)小時(shí)。
因此由于要進(jìn)行RTTOV傳輸模式的研究,必須要進(jìn)行大規(guī)模的廓線數(shù)據(jù)處理,決心轉(zhuǎn)戰(zhàn)GRIB2-API的FORTRAN API, 據(jù)稱可以大大提高文件I/O效率
GRIB-API 由 ECMWF 開發(fā),放出官方主頁:
話不多說,我們開始操作吧
一.JPEG 依賴庫
要讀取GRIB文件中的數(shù)組,我們要先安裝一個(gè)JPEG庫, 有兩種安裝方式
- 編譯安裝
官網(wǎng), 編譯安裝比較簡單,就不細(xì)說了
- 或者使用Ubuntu自帶的庫包管理系統(tǒng)
$ 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
如果報(bào)錯(cuò)沒有cmake工具,不妨 apt-get 安裝一下
Cmake聲明依賴環(huán)境路徑的方式比較特殊,要在前面加一個(gè)“D”
$ make
$ ctest
$ sudo make install
ctest時(shí)可能測(cè)試需要下載一些網(wǎng)絡(luò)文件,會(huì)比較慢,需要耐心等待,出現(xiàn)download測(cè)試點(diǎn)FAIL也不用擔(dān)心,主要是我們偉大的墻....
安裝完后,我們看看bin目錄下有這些可執(zhí)行文件:
-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*
添加到環(huán)境變量
export PATH=/usr/local/gribapi/bin:$PATH
筆者對(duì)安裝好的GRIB API做了一個(gè)測(cè)試:
$ grib_dump rmf.gra.2018070800003.grb2 > rmf.gra.2018070800003.grb2.dumped
發(fā)現(xiàn)有大量報(bào)錯(cuò)提示JPEG庫沒有安裝
JPEG庫本質(zhì)上是一個(gè)圖像encoding/decoding庫包,依賴該庫包編譯的GRIB_API才能對(duì)編碼的數(shù)據(jù)進(jìn)行讀寫。正因?yàn)樽x寫GRIB數(shù)據(jù)需要解碼/編碼,因此速度非常慢
原來筆者需要讀取的數(shù)據(jù)打包格式是grid_jpeg, 如果不安裝支持JPEG那么就無法正常解碼并讀取這些數(shù)據(jù),因此務(wù)必要在GRIB_API編譯安裝時(shí)依賴JPEG庫
JPEG庫有兩種選擇
- OPENJPEG (<= 1.5.2)
- JASPER
筆者這里選擇了JASPER
三 JASPER 庫的編譯安裝
jasper 官網(wǎng)
編譯安裝, 按照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 監(jiān)測(cè) Jasper 庫連接會(huì)有一些問題,原因不明, 筆者暫時(shí)沒有時(shí)間仔細(xì)研究,歡迎評(píng)論補(bǔ)充
$ 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
有幾種報(bào)錯(cuò):
- 找不到頭文件
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
那是因?yàn)槟阒付ǖ膇nclude頭文件位置有一個(gè)jasper文件夾隱藏在下面, include目錄下沒有現(xiàn)成的頭文件, 解決方案之一是把藏在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 <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 上的 一個(gè) issue
我們認(rèn)為是版本升級(jí)后和舊版本的不兼容問題,結(jié)構(gòu)分支已經(jīng)廢棄了, 注釋掉這行源碼就行
修改 : /src/grib_jasper_encoding.c 注釋掉 113行
- 找不到庫
3.1 cmake時(shí)
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時(shí)
undefined references to: 'jas_stream_memopen', 'jpc_decode', 'jas_matrix_create', 'jas_image_destroy', 'jpc_decode'
ECMWF 的 FAQ中提到了這個(gè)問題
https://confluence.ecmwf.int/display/OIFS/FAQ%3A+Frequently+Asked+Questions
這就是剛剛筆者說的找不到連接庫的問題, 不是很明確Cmake有什么問題
添加 LD_LIBRARY_PATH 不 work
歡迎補(bǔ)充,因此放棄了cmake
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
暫時(shí)就用./configure測(cè)試,發(fā)現(xiàn)沒有問題
$ cd grib_api-1.27.0-Source
$ ./configure --prefix=/usr/local/gribapi_withjasper --with-jasper=/usr/local/jasper
$ make
$ sudo make install
五. pygrib 安裝
這一部分主要參考一篇 CSDN 的文章
先在環(huán)境下安裝 matplotlib
筆者用conda 環(huán)境管理
$ conda install matplotlib
$ conda install numpy
$ conda install basemap
$ conda install pyproj
$ conda install geos
環(huán)境搭建好后主要看 pygrib 安裝
pygrib 有超出conda環(huán)境的依賴關(guān)系, 不能通過conda直接安裝, 需要指定依賴關(guān)系后編譯安裝
去github下載源碼
筆者下載的是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
打完收工, 測(cè)試成功。
下期講GRIB API的基本使用。
參考都放在隨筆中, 恕不在結(jié)尾另外列出