bufr.pm:bufrresolve_source

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision Both sides next revision
bufr.pm:bufrresolve_source [2016-04-18 07:52:19]
pals
bufr.pm:bufrresolve_source [2019-02-16 07:15:21]
pals
Line 1: Line 1:
 <code perl> <code perl>
-#!/usr/bin/perl -w+#!/usr/bin/perl
  
-# (C) Copyright 2010-2016 MET Norway+# (C) Copyright 2010-2019 MET Norway
 # #
 # This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
Line 22: Line 22:
  
 use strict; use strict;
 +use warnings;
 use Getopt::Long; use Getopt::Long;
 use Pod::Usage qw(pod2usage); use Pod::Usage qw(pod2usage);
 use Geo::BUFR; use Geo::BUFR;
 +
 +# This is actually default in BUFR.pm, but provided here to make it
 +# easier for users to change to 'ECCODES' if preferred
 +use constant DEFAULT_TABLE_FORMAT => 'BUFRDC';
  
 # Will be used if neither --tablepath nor $ENV{BUFR_TABLES} is set # Will be used if neither --tablepath nor $ENV{BUFR_TABLES} is set
-use constant DEFAULT_TABLE_PATH => '/usr/local/lib/bufrtables';+use constant DEFAULT_TABLE_PATH_BUFRDC => '/usr/local/lib/bufrtables'; 
 +use constant DEFAULT_TABLE_PATH_ECCODES => '/usr/local/share/eccodes/definitions/bufr/tables';
 # Ought to be your most up-to-date B table # Ought to be your most up-to-date B table
-use constant DEFAULT_TABLE => 'B0000000000000023000';+use constant DEFAULT_TABLE_BUFRDC => 'B0000000000000029000'; 
 +use constant DEFAULT_TABLE_ECCODES => '0/wmo/29';
  
 # Parse command line options # Parse command line options
Line 36: Line 43:
 GetOptions( GetOptions(
            \%option,            \%option,
-           'tablepath=s',# Set BUFR table path+           'bufrtable=s',# Set BUFR tables
            'code=s',     # Print the contents of code table            'code=s',     # Print the contents of code table
            'flag=i',     # Resolve the flag value given            'flag=i',     # Resolve the flag value given
Line 45: Line 52:
            'simple',     # Like 'partial', but displaying the resulting            'simple',     # Like 'partial', but displaying the resulting
                          # descriptors on one line                          # descriptors on one line
-           'bufrtable=s',# Set BUFR tables+           'tableformat=s',  # Set BUFR table format 
 +           'tablepath=s',# Set BUFR table path
            'verbose=i',  # Display path and tables used            'verbose=i',  # Display path and tables used
        ) or pod2usage(-verbose => 0);        ) or pod2usage(-verbose => 0);
Line 83: Line 91:
 # bufrresolve.pl to complain in this case # bufrresolve.pl to complain in this case
 Geo::BUFR->set_strict_checking(2); Geo::BUFR->set_strict_checking(2);
 +
 +# Set BUFR table format
 +my $tableformat = (defined $option{tableformat}) ? uc $option{tableformat} : DEFAULT_TABLE_FORMAT;
 +Geo::BUFR->set_tableformat($tableformat);
  
 # Set BUFR table path # Set BUFR table path
Line 92: Line 104:
     Geo::BUFR->set_tablepath($ENV{BUFR_TABLES});     Geo::BUFR->set_tablepath($ENV{BUFR_TABLES});
 } else { } else {
-    # If all else fails, use the libbufr bufrtables +    # If all else fails, use the default tablepath in BUFRDC/ECCODES 
-    Geo::BUFR->set_tablepath(DEFAULT_TABLE_PATH);+    if ($tableformat eq 'BUFRDC') { 
 +        Geo::BUFR->set_tablepath(DEFAULT_TABLE_PATH_BUFRDC); 
 +    } elsif ($tableformat eq 'ECCODES'
 +        Geo::BUFR->set_tablepath(DEFAULT_TABLE_PATH_ECCODES); 
 +    }
 } }
  
 # BUFR table file to use # BUFR table file to use
-my $table = $option{bufrtable} || DEFAULT_TABLE;+my $table = $option{bufrtable} || 
 +    ($tableformat eq 'BUFRDC' ? DEFAULT_TABLE_BUFRDC : DEFAULT_TABLE_ECCODES);
  
 my $bufr = Geo::BUFR->new(); my $bufr = Geo::BUFR->new();
Line 137: Line 154:
      [--simple]      [--simple]
      [--noexpand]      [--noexpand]
-     [--bufrtable <name of BUFR table]+     [--bufrtable <name of BUFR table
 +     [--tableformat <BUFRDC|ECCODES>]
      [--tablepath <path to BUFR tables>]      [--tablepath <path to BUFR tables>]
      [--verbose n]      [--verbose n]
Line 143: Line 161:
  
   2) bufrresolve.pl --code <code or flag table>   2) bufrresolve.pl --code <code or flag table>
-     [--bufrtable <name of BUFR table>]+     [--bufrtable <name of BUFR table>] 
 +     [--tableformat <BUFRDC|ECCODES>]
      [--tablepath <path to BUFR tables>]      [--tablepath <path to BUFR tables>]
      [--verbose n]      [--verbose n]
  
   3) bufrresolve.pl --flag <value> --code <flag table>   3) bufrresolve.pl --flag <value> --code <flag table>
-     [--bufrtable <name of BUFR table]+     [--bufrtable <name of BUFR table
 +     [--tableformat <BUFRDC|ECCODES>]
      [--tablepath <path to BUFR tables>]      [--tablepath <path to BUFR tables>]
      [--verbose n]      [--verbose n]
Line 160: Line 180:
 examples of use. examples of use.
  
-It is supposed that the code and flag tables are contained in a file +The tables used can be selected by the user with options 
-with same name as corresponding B table except for having prefix C +C<--bufrtable>C<--tablepath> and C<--tableformat>. Default 
-instead of B. The tables used can be chosen by the user with options +tableformat in Geo::BUFR is BUFRDCwhile default tablepath in 
-C<--bufrtable> and C<--tablepath>. Default is the hard coded +bufrresolve.pl will be overridden if the environment variable 
-DEFAULT_TABLE in directory DEFAULT_TABLE_PATHbut this last one will +BUFR_TABLES is set. You should consider edit the source code of 
-be overriden if the environment variable BUFR_TABLES is set. You +bufrresolve.pl if you are not satisfied with the defaults chosen for 
-should consider edit the source code if you are not satisfied with the +tablepath and bufrtable (search for 'DEFAULT'). 
-defaults chosen.+ 
 +For tableformat ECCODES, see 
 +L<http://search.cpan.org/dist/Geo-BUFR/lib/Geo/BUFR.pm#BUFR-TABLE-FILES> 
 +for more info on how to set C<--tablepath>
 + 
 +For the table name in C<--bufrtable> in BUFRDC, use basename of B 
 +table, e.g.  B0000000000098013001.TXT. Replacing B with D or C, or 
 +omitting this prefix altogether, or even omitting the trailing '.TXT' 
 +(i.e. 0000000000098013001) will also work. 
 + 
 +For the table name in C<--bufrtable> in ECCODES, use last significant part 
 +of table location, e.g. '0/wmo/29' for WMO master tables or 
 +'0/local/8/78/236' for local tables on Unix-like systems. For looking 
 +up local sequence descriptors, you might need to provide both a master 
 +and the local table to get the full expansion, e.g. 
 +'0/wmo/29,0/local/8/78/236'
 + 
 +See also L</"CAVEAT"> below for more about the C<--bufrtable> option.
  
 =head1 OPTIONS =head1 OPTIONS
Line 175: Line 212:
                 descriptors on one line                 descriptors on one line
    --noexpand   Don't expand D descriptors at all    --noexpand   Don't expand D descriptors at all
- 
    --bufrtable <name of BUFR B or D table>  Set BUFR tables    --bufrtable <name of BUFR B or D table>  Set BUFR tables
 +   --tableformat Currently supported are BUFRDC and ECCODES (default is BUFRDC)
    --tablepath <path to BUFR tables>  Set BUFR table path    --tablepath <path to BUFR tables>  Set BUFR table path
    --verbose n  Display path and tables used if n > 0    --verbose n  Display path and tables used if n > 0
- 
    --help       Display Usage and explain the options used. Almost    --help       Display Usage and explain the options used. Almost
                 the same as consulting perldoc bufrresolve.pl                 the same as consulting perldoc bufrresolve.pl
Line 195: Line 231:
  
 Options may be abbreviated, e.g. C<--h> or C<-h> for C<--help> Options may be abbreviated, e.g. C<--h> or C<-h> for C<--help>
 +
 +=head1 CAVEAT
 +
 +The C<--bufrtable> option could be considered mandatory, since there
 +is no guarantee that the same BUFR descriptor resolves the same way
 +for different BUFR tables. However, as soon as a new BUFR descriptor
 +is introduced in a BUFR table, it is extremely rare that the
 +descriptor is redefined in later versions. So for convenience,
 +bufrresolve.pl uses a default table (adding option C<--verbose 1> will
 +tell you which table, unless you use C<--bufrtable> to set the table
 +explicitely). If this is the wrong table for your purpose (most common
 +case will be if the descriptor was added in a higher version than that
 +of the default table), you definitely should use C<--bufrtable> with
 +the appropriate table.
  
 =head1 NOTE ON --VERBOSE =head1 NOTE ON --VERBOSE
Line 202: Line 252:
 or later someone would type C<bufrresolve.pl 307080 --verbose 1> which or later someone would type C<bufrresolve.pl 307080 --verbose 1> which
 by Perl would be interpreted as if the arguments were C<307080 000001 by Perl would be interpreted as if the arguments were C<307080 000001
---verbose>, which probably is not what the user intended.+--verbose>, which probably is not what you intended.
  
 =head1 AUTHOR =head1 AUTHOR
Line 210: Line 260:
 =head1 COPYRIGHT =head1 COPYRIGHT
  
-Copyright (C) 2010-2016 MET Norway+Copyright (C) 2010-2019 MET Norway
  
 =cut =cut
  
 </code> </code>
  • bufr.pm/bufrresolve_source.txt
  • Last modified: 2023-02-05 10:15:44
  • by pals