ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写


参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.html
https://confluence.ecmwf.int/download/attachments/73011815/eccodes_grib_f90_python_part2.pdf

基本解码流程

1. 指定打开方式(“读”或“写”),打开一个或多个GRIB文件:

2. 根据不同加载方式,加载一个或多个GRIB messages到内存:
  有两种函数:codes_grib_new_from_file 和 codes_new_from_index。调用后会返回一个唯一的identifier,用于对已加载的GRIB messages进行操纵。

3. 调用函数对已加载的GRIB messages进行解码:
  codes_get函数
  可以解码需要的数据

4. 释放已经加载的GRIB messages:
  codes_release  

5. 关闭打开的 GRIB 文件.

此外,eccodes还有以下功能:

eccodes的主要目的是提供一个高水平的方法,用以从一个加载的GRIB messages对象去提取和计算出更多额外的信息:

· 返回平均,最小,最大,特定的经纬度等的关键字; 

· 计算经纬度和值:codes_grib_get_data; 

· 提取值的子例程:
  codes_grib_find_nearest 去提取出距离给定地理点最近位置的点的值
  codes_get_element 从列表中提取值

· 基于索引访问(indexed access)的子例程:这些是随机访问的方法,通常比顺序访问更快。

 

-----------------------------------------------------------------

顺序访问方式:

大致思路:

-> codes_open_file 

-> codes_grib_new_from_file -> codes_get -> call codes_release

     …

-> codes_grib_new_from_file -> codes_get-> call codes_release 

-> codes_close_file(ifile)

 

示例代码:

 

 

索引访问方式(通常比顺序访问快):

大致思路:

-> codes_index_create(从grib文件创建index) 或 codes_index_read(读取已有index)

-> codes_index_select 选取键值

-> codes_new_from_index -> codes_get -> call codes_release

     …

-> codes_new_from_index -> codes_get -> call codes_release

-> codes_index_release

 

 示例代码:


-----------------------------------------------------------------

 一个索引文件可以保存到文件供以后再使用

codes_index_write (indexid, filename, status)

  Saves an index to a file for later reuse.
  保存索引文件便于以后使用

codes_index_read (indexid, filename, status)
  Load an index file previously created with codes_index_write.
  加载一个索引文件(该索引文件之前已由codes_index_write命令创建)

同样,可以将数据文件的内容加到一个索引中

codes_index_add_file (indexid, filename, status)

  Add a file to an index.
  将一个文件加入到索引文件中

可以用ecCodes命令grib_index_build创建索引

'grib_dump -D <索引文件>‘将会显示一个索引文件的内容

 

可能用到的几个子例行程序:

codes_index_create(indexid, filename, keys, status)  创建文件内容索引

codes_index_get_size(indexid, key, size, status)  得到索引中关键字的维数

codes_index_get(indexid, key, values, status)  得到索引中关键字的不同值

codes_index_select(indexid, key, value, status)  选取索引中关键字的值

codes_index_create(indexid, filename, keys, status)   创建文件内容的索引

codes_index_get_size(indexid, key, size, status)  某个关键字的维数

codes_index_get(indexid, key, values, status)   得到索引中关键字的值

codes_index_select(indexid, key, value, status)  选取索引中一个关键字的值

codes_new_from_index(indexid, igrib, status  加载对应于选取模式的GRIB message

codes_index_release(indexid, status)  释放索引

codes_release(igrib)  释放GRIB message

 
-----------------------------------------------------------------

部分函数参考:

codes_get (msgid, key, value, status)
  Get the value for a key from a grib message
  从grib message中获取键值

codes_get_element (msgid, key, kindex, value, status)
  Get a value of specified index from an array key
  从一个键数组中获取给定索引的值

codes_get_error_string (error, error_message, status)
  Get the error message given an error code.
  输入错误码,返回错误消息
  error       错误码
  error messages   错误消息
  status      如果成功返回CODES_SUCCESS,错误返回整数值

codes_get_message_size (msgid, nbytes, status)
  Get the size of a coded message
  得到编码message的大小

codes_get_size (msgid, key, size, status)
  Get the size of an array key
  得到键数组的大小

codes_grib_find_nearest (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, kindex, status)
  Find the nearest point/points of a given latitude/longitude point. 
  寻找距给定经纬度点最近的点

codes_grib_get_data (gribid, lats, lons, values, status)
  Get latitude/longitude and data values. 
  得到经纬度和数据值

codes_index_add_file (indexid, filename, status)
  Add a file to an index.
  将一个文件加入到索引文件中

codes_index_create (indexid, filename, keys, status)
  to create the index of the content of a file 创建文件内容索引
  indexid  新建索引文件的id
  filename  被索引messages的文件的名称
  keys    用逗号分隔的关键字关键字的类型可以在后面追加(:l,表示长整型,:i短整型,:d双精度,:s字符串)如果没有显式声明类型,那么假设类型默认。
  status   如果成功返回CODES_SUCCESS,错误返回整数值

codes_index_get (indexid, key, values, status)
  Get the distinct values of the key in argument contained in the index. 
  得到包含在索引中声明的特定关键字的特定值

codes_index_get_size (indexid, key, size, status)
  to get the dimension of a key in the index
  
得到索引的关键字的维数

codes_index_read (indexid, filename, status)
  Load an index file previously created with codes_index_write.
  加载一个索引文件(该索引文件之前已由codes_index_write命令创建)

codes_index_release (indexid, status)
  释放index
  indexid   id of an index created from a file.

  status    CODES_SUCCESS if OK, integer value on erro

codes_index_select (indexid, key, value, status)
  Select the message subset with key==value.
  用key==valued选取消息子集

codes_index_write (indexid, filename, status)
  Saves an index to a file for later reuse.
  保存索引文件便于以后使用

codes_new_from_file (ifile, msgid, product_kind, status)

  从该文件中加载一个message 到内存。输入文件id、数据类型,并返回message id
  可以通过msgid直接访问该message,msgid一直可用,调用codes_release函数之前。 

codes_new_from_index (indexid, msgid, status)
  在选定key值后,从一个index创建一个新的handle。
  在调用这个函数前,index的所有keys都比必须确定。 连续调用这个函数 将返回index keys中 所有符合定义的handles。当没有更多的可用处理从索引中返回一个空指针变量,并且err变量值设置为CODES_END_OF_INDEX。

codes_new_from_message(msgid, message, status)
  Create a new message in memory from an integer or character array containting the coded message
  在包含编码消息的整型或字符型数组 中在内存中创建新消息

codes_grib_new_from_samples (gribid, samplename, status)
  Create a new valid gribid from a GRIB sample contained in a samples directory pointed by the environment variable ECCODES_SAMPLES_PATH.
  在ECCODES_SAMPLES_PATH环境变量指定的样本路径中的GRIB样本,创建新的可用的gribid.(编码时候用)
  gribid   id of the grib loaded in memory 输出量,加载到内存中的message的id

  samplename   name of the sample to be used 输入量,样本名称
  status   CODES_SUCCESS if OK, integer value on error 输出量,是否成功

codes_open_file (ifile, filename, mode, status)
  Open a file according to a mode. 根据模式打开文件

  ifile   id of the opened file to be used in all the file functions.
  filename   name of the file to be open
  mode   open mode can be 'r' (read only), 'w' (write only) or 'a' (append)
  status   如果成功返回CODES_SUCCESS,错误返回整数值

codes_read_bytes (ifile, buffer, nbytes, status)
  Reads nbytes bytes into the buffer from a file opened with codes_open_file

codes_read_from_file (ifile, buffer, nbytes, status)
  Reads a message in the buffer array from the file opened with codes_open_file.

codes_set (msgid, key, value, status)
  Set the value for a key in a message.
  在message中设置键值

codes_write_bytes_int4 (ifile, buffer, nbytes, status)
  Write nbytes bytes from the buffer in a file opened with codes_open_file.

 

 

 

 

 

 

 

 


作者:chinagod,发布于:2018/11/09
原文:https://www.cnblogs.com/jiangleads/p/9911738.html