GRIB API学习笔记05——GRIB APIs 第一部分
参见3A1-grib_api_1.pdf
1.1. 介绍
首先考虑是否真的需要写程序?
GRIB命令行工具是否能完成任务
在气象模式和某些后处理中需要编解码GRIB数据
写程序比试着获取工具或脚本更有效率
1.2. GRIB API库
使用ANSI C 99编写,只需要jasper库用与jpeg2000的编解码(windroc注:openjpeg也可以),编译时使用—disable-jpeg将不使用jpeg库。
1.3. Fortran 90接口
参看第二章
1.4. 从GRIBEX迁移到GRIB API
略过
1.5. C接口
1.5.1. 特点
头文件 #include “grib_api.h”
export GRIB_API_VERSION=1.9.16
编译:
IBM:
xlc myprogram.c $GRIB_API_INCLUDE $GRIB_API_LIB –lm
Linux:
[gcc|pgcc] myprogram.c $GRIB_API_INCLUDE $GRIB_API_LIB –lm
主要不同点:
C接口更精确,例如指定类型的函数,如grib_get_double()
没有一些辅助函数,如grib_open_file()
1.5.2. 错误检查
GRIB_CHECK为GRIB API函数的内置错误检查。
[cpp]GRIB_CHECK(grib_get_long(h,”Ni”,&Ni),0);[/cpp]
或者将错误码作为函数参数:
[cpp]
h = grib_handle_new_from_file(0,in,&err);
GRIB_CHECK(err,0);
[/cpp]
也可以手动检查状态:
[cpp]
err = grib_get_long(h,”Ni”,&Ni);
if (err != 0) {
printf(“Error: %s \n unable to get long variable\n”,grib_get_error_message(err));
exit(1); }
[/cpp]
1.5.3. 加载/释放GRIB消息
grib_handle *h;
提供访问解析过的grib数值的结构体
fp=fopen(filename,”r”)
来自样本文件
来自内存
grib_handle_delete(h);
释放句柄
1.5.4. 解码
*int grib_get_double(grib_handle *h, const char *key, double value)
获取key的双精度值。如果多个key有相同的名字,返回最后一个。长整形long也有类似的函数。
1.6. Python接口
1.6.1. 特点
使用import gribapi加载
导入相关函数
低层,函数式
提供大部分C函数的对应函数
使用NumPy模块操控数据
1.6.2. 加载/释放GRIB消息
返回文件中GRIB消息的句柄
要求输入文件为python文件对象
目前不推荐使用headers_only选项
返回示例目录下的消息句柄
返回内存中消息的句柄
释放句柄
1.6.3. 解码
按原始格式返回gid所指向的消息中key的值。
或者,使用type关键字选择返回值的格式(int,str或float)
values = grib_get_array**(gid, key, type=None)**
返回数值的一维数组
values = grib_get_elements(gid, key, indexes)
获取指定key的特定元素列表?
Retrieve the elements of the key array for the indexes specified in the input.
出错时,抛出异常GribInternalError(封装C API的错误)
1.6.4. 实用工具
寻找指定经纬度最近的点
grib_iterator_delete****(iter_id)
1.7. 参考
GRIB-1, GRIB-2:
<//www.wmo.int/pages/prog/www/WMOCodes.html>
GRIB API:
https://software.ecmwf.int/wiki/display/GRIB/GRIB+API/
GRIB API Fortran, C or Python interfaces:
f90: https://software.ecmwf.int/wiki/display/GRIB/Fortran+package+grib_api
C: https://software.ecmwf.int/wiki/display/GRIB/Module+Index
Python: https://software.ecmwf.int/wiki/display/GRIB/Python+package+gribapi
GRIB API examples:
https://software.ecmwf.int/wiki/display/GRIB/Grib+API+examples
GRIBEX – GRIB API conversion
https://software.ecmwf.int/wiki/display/GRIB/GRIBEX+keys