Description

This example shows: how to read attributes of keys in BUFR messages.

Source code

bufr_attributes.f90
!
! Copyright 2005- ECMWF.
!
! This software is licensed under the terms of the Apache Licence Version 2.0
! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
!
! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
!
!
! FORTRAN 90 Implementation: bufr_attributes
!
! Description: how to read attributes of keys in BUFR messages.
!
!
program bufr_attributes
use eccodes
implicit none
integer            :: ifile
integer            :: iret
integer            :: ibufr
integer            :: count=0
integer(kind=4)    :: iVal,conf
real(kind=8)       :: t2m
character(len=32)   :: units, confUnits

  call codes_open_file(ifile,'../../data/bufr/syno_multi.bufr','r')

! the first bufr message is loaded from file
! ibufr is the bufr id to be used in subsequent calls
  call codes_bufr_new_from_file(ifile,ibufr,iret)

  do while (iret/=CODES_END_OF_FILE)

    ! Get and print some keys form the BUFR header
    write(*,*) 'message: ',count

    ! We need to instruct ecCodes to expand all the descriptors
    ! i.e. unpack the data values
    call codes_set(ibufr,"unpack",1);

    ! ----------------------------------------------------------------
    !  We will read the value and all the attributes available for
    !  the 2m temperature.
    ! ----------------------------------------------------------------

    ! Get the element's value as as real
    call codes_get(ibufr,'airTemperatureAt2M',t2m);
    write(*,*) '  airTemperatureAt2M:',t2m

    ! Get the element's code (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->code',iVal);
    write(*,*) '  airTemperatureAt2M->code:',iVal

    ! Get the element's units (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->units',units)
    write(*,*) '  airTemperatureAt2M->units:',units

    ! Get the element's scale (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->scale',iVal);
    write(*,*) '  airTemperatureAt2M->code:',iVal

    ! Get the element's reference (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->reference',iVal);
    write(*,*) '  airTemperatureAt2M->reference:',iVal

    ! Get the element's width (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->width',iVal);
    write(*,*) '  airTemperatureAt2M->width:',iVal

    ! -------------------------------------------------------------------
    !  The 2m temperature data element in this message has an associated
    !  field: percentConfidence. Its value and attributes can be accessed
    !  in a similar manner as was shown above for 2m temperature.
    ! -------------------------------------------------------------------

    ! Get the element's value as as real
    call codes_get(ibufr,'airTemperatureAt2M->percentConfidence',conf);
    write(*,*) '  airTemperatureAt2M->percentConfidence:', conf

    ! Get the element's code (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->code',iVal);
    write(*,*) '  airTemperatureAt2M->percentConfidence->code:',iVal

    ! Get the element's units (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->units',confUnits)
    write(*,*) '  airTemperatureAt2M->percentConfidence->units:',confUnits

    ! Get the element's scale (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->scale',iVal);
    write(*,*) '  airTemperatureAt2M->percentConfidence->code:',iVal

    ! Get the element's reference (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->reference',iVal);
    write(*,*) '  airTemperatureAt2M->percentConfidence->reference:',iVal

    ! Get the element's width (see BUFR code table B)
    call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->width',iVal);
    write(*,*) '  airTemperatureAt2M->percentConfidence->width:',iVal

    ! Release the bufr message
    call codes_release(ibufr)

    ! Load the next bufr message
    call codes_bufr_new_from_file(ifile,ibufr,iret)

    count=count+1

  end do

  ! Close file
  call codes_close_file(ifile)

end program bufr_attributes
bufr_attributes.py
# Copyright 2005- ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities
# granted to it by virtue of its status as an intergovernmental organisation
# nor does it submit to any jurisdiction.

#
# Python implementation: bufr_attributes
#
# Description: how to read attributes of keys in BUFR messages.
#
#
import sys
import traceback

from eccodes import *

INPUT = '../../data/bufr/syno_multi.bufr'
VERBOSE = 1  # verbose error reporting


def example():
    # open bufr file
    f = open(INPUT, 'rb')

    cnt = 0

    # define the attributes to be printed (see BUFR code table B)
    attrs = [
        'code',
        'units',
        'scale',
        'reference',
        'width'
    ]

    # loop for the messages in the file
    while 1:
        # get handle for message
        bufr = codes_bufr_new_from_file(f)
        if bufr is None:
            break

        print("message: %s" % cnt)

        # we need to instruct ecCodes to expand all the descriptors
        # i.e. unpack the data values
        codes_set(bufr, 'unpack', 1)

        # --------------------------------------------------------------
        # We will read the value and all the attributes available for
        # the 2m temperature.
        # --------------------------------------------------------------
        # get the value
        key = 'airTemperatureAt2M'
        try:
            print('  %s: %s' % (key, codes_get(bufr, key)))
        except CodesInternalError as err:
            print('Error with key="%s" : %s' % (key, err.msg))

        # print the values of the attributes of the key. Attributes themselves
        # are keys as well. Their name is constructed like:
        # keyname->attributename
        for attr in attrs:
            key = 'airTemperatureAt2M' + "->" + attr
            try:
                print('  %s: %s' % (key, codes_get(bufr, key)))
            except CodesInternalError as err:
                print('Error with key="%s" : %s' % (key, err.msg))

        # ------------------------------------------------------------------
        # The 2m temperature data element in this message has an associated
        # field: percentConfidence. Its value and attributes can be accessed
        # in a similar manner as was shown above for 2m temperature.
        # ------------------------------------------------------------------

        # get the value
        key = 'airTemperatureAt2M->percentConfidence'
        try:
            print('  %s: %s' % (key, codes_get(bufr, key)))
        except CodesInternalError as err:
            print('Error with key="%s" : %s' % (key, err.msg))

        # print the values of the attributes of the key.
        for attr in attrs:
            key = 'airTemperatureAt2M->percentConfidence' + "->" + attr
            try:
                print('  %s: %s' % (key, codes_get(bufr, key)))
            except CodesInternalError as err:
                print('Error with key="%s" : %s' % (key, err.msg))

        cnt += 1

        # delete handle
        codes_release(bufr)

    # close the file
    f.close()


def main():
    try:
        example()
    except CodesInternalError as err:
        if VERBOSE:
            traceback.print_exc(file=sys.stderr)
        else:
            sys.stderr.write(err.msg + '\n')

        return 1


if __name__ == "__main__":
    sys.exit(main())
bufr_attributes.c
/*
 * Copyright 2005- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 *
 * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
 * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 */

/*
 * C Implementation: bufr_attributes
 *
 * Description: how to read attributes of keys in BUFR messages.
 *
 */

#include "eccodes.h"


int main(int argc,char* argv[])
{
    FILE* in = NULL;

    /* message handle. Required in all the eccodes calls acting on a message.*/
    codes_handle* h=NULL;

    char* units= NULL;
    char* unitsPercent= NULL;
    long longVal;
    double doubleVal;
    size_t len=0;
    int err=0;
    int cnt=0;
    const char* infile = "../../data/bufr/syno_multi.bufr";

    in=fopen(infile,"rb");
    if (!in) {
        printf("ERROR: unable to open file %s\n", infile);
        return 1;
    }

    /* loop over the messages in the bufr file */
    while ((h = codes_handle_new_from_file(NULL, in, PRODUCT_BUFR, &err)) != NULL || err != CODES_SUCCESS)
    {
        if (h == NULL) {
            printf("Error: unable to create handle for message %d\n",cnt);
            cnt++;
            continue;
        }

        printf("message: %d\n",cnt);

        /* we need to instruct ecCodes to expand the descriptors
          i.e. unpack the data values */
        CODES_CHECK(codes_set_long(h, "unpack", 1),0);

        /* ----------------------------------------------------------------
           We will read the value and all the attributes available for
           the 2m temperature.
        -------------------------------------------------------------------*/

        /* get the value as double */
        CODES_CHECK(codes_get_double(h, "airTemperatureAt2M", &doubleVal),0);
        printf("  airTemperatureAt2M: %.2f\n",doubleVal);

        /* get the element's code (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->code", &longVal),0);
        printf("  airTemperatureAt2M->code: %ld\n",longVal);

        /* get the element's units (see BUFR code table B) */

        /* get the size and allocate memory*/
        CODES_CHECK(codes_get_length(h, "airTemperatureAt2M->units", &len), 0);
        units = (char*)malloc(len*sizeof(char));

        /* get the values*/
        codes_get_string(h, "airTemperatureAt2M->units", units, &len);
        printf("  airTemperatureAt2M->units: %s\n", units);

        /* get the element's scale (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->scale", &longVal),0);
        printf("  airTemperatureAt2M->scale: %ld\n",longVal);

        /* get the element's reference (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->reference", &longVal),0);
        printf("  airTemperatureAt2M->reference: %ld\n",longVal);

        /* get the element's width (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->width", &longVal),0);
        printf("  airTemperatureAt2M->width: %ld\n",longVal);

        /* -----------------------------------------------------------------
           The 2m temperature data element in this message has an associated
           field: percentConfidence. Its value and attributes can be accessed
           in a similar manner as was shown above for 2m temperature.
           ----------------------------------------------------------------- */

        /* get the value as long */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence", &longVal),0);
        printf("  airTemperatureAt2M->percentConfidence: %ld\n",longVal);

        /* get the element's code (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->code", &longVal),0);
        printf("  airTemperatureAt2M->percentConfidence->code: %ld\n",longVal);

        /* get the element's units (see BUFR code table B) */

        /* get the size and allocate memory*/
        CODES_CHECK(codes_get_length(h, "airTemperatureAt2M->percentConfidence->units", &len), 0);
        unitsPercent = (char*)malloc(len*sizeof(char));

        /* get the values*/
        codes_get_string(h, "airTemperatureAt2M->percentConfidence->units", unitsPercent, &len);
        printf("  airTemperatureAt2M->percentConfidence->units: %s\n", unitsPercent);

        /* get the element's scale (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->scale", &longVal),0);
        printf("  airTemperatureAt2M->percentConfidence->scale: %ld\n",longVal);

        /* get the element's reference (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->reference", &longVal),0);
        printf("  airTemperatureAt2M->percentConfidence->reference: %ld\n",longVal);

        /* get the element's width (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->width", &longVal),0);
        printf("  airTemperatureAt2M->percentConfidence->width: %ld\n",longVal);

        /* free allocated arrays */
        free(units);
        free(unitsPercent);

        /* delete handle */
        codes_handle_delete(h);

        cnt++;
    }

    fclose(in);
    return 0;
}