参数数据库

GRIB 1 参数(WMO 编码)

10 metre U wind component

indicatorOfParameter = 33 [u-compoment of wind (m/s)]

table2Version = 3

indicatorOfTypeOfLevel = 105 [Specified height level above ground (m)]

level = 10

GRIB 2 参数(WMO 编码)

10 metre U wind component

discipline = 0 [Meteorological products]

parameterCategory = 2 [Monmentum]

parameterNumber = 2 [u-component of wind (m s-1)]

typeOfFirstFixedSurface = 103 [Specified height level above ground (m)]

scaleFactorOfFirstFixedSurface = 0

scaledValueOfFirstFixedSurface = 10

GRIB 1 参数(ECMWF 本地编码)

10 metre U wind component

indicatorOfParameter =165 [10 metere u-compoment of wind (m/s)]

table2Version = 128

ecCodes 的解决方案

有多种编码变量的方法。

ecCodes 使用一个虚拟的 key(计算key)来解耦用户层和编码层。

用户代码获取/设置一个虚拟 key,ecCodes 获取/设置实际编码的 key。

本地配置用于处理本地编码。

ecCodes 变量

ecCodes 提供一些版本无关的 key 用于定义变量:

  • paramId
  • shortName
  • name
  • units
  • centre

GRIB 1 使用如下 key:

  • centre
  • table2Version
  • indicatorOfParameter
  • levelType
  • level
  • ...

GRIB 2 使用如下 key:

  • discipline
  • parameterCategory
  • parameterNumber
  • typeOfFirstFixedSurface
  • scaleFactorOfFirstFixedSurface
  • scaledValueOfFirstFixedSurface
  • typeOfSecondFixedSurface
  • scaleFactorOfSecondFixedSurface
  • scaledValueOfSecondFixedSurface
  • ...

概念

之前的章节中介绍过 ecCodes 的架构:

下面介绍几个与变量有关的重要概念。

shortName

GRIB 2:

'2t' = { 
    discipline=0; 
    parameterCategory=0; 
    parameterNumber=0; 
    typeOfFirstFixedSurface=103; 
    scaleFactorOfFirstFixedSurface=0; 
    scaledValueOfFirstFixedSurface=2; 
}

GRIB 1:

'2t' = { 
    indicatorOfParameter=11; 
    table2Version=3;
    levelType=105; 
    level=2;
}

GRIB 1 ECMWF 本地编码:

'2t' = { 
    indicatorOfParameter=167; 
    table2Version=128;
}

paramId

GRIB 2:

167 = { 
    discipline=0; 
    parameterCategory=0; 
    parameterNumber=0; 
    typeOfFirstFixedSurface=103; 
    scaleFactorOfFirstFixedSurface=0; 
    scaledValueOfFirstFixedSurface=2; 
}

GRIB 1:

167 = { 
    indicatorOfParameter=11; 
    table2Version=3;
    levelType=105; 
    level=2;
}

GRIB 1 ECMWF 本地编码:

167 = { 
    indicatorOfParameter=167; 
    table2Version=128;
}

ecCodes 使用的 GRIB 参数

访问如下网址,查询参数数据库:

http://apps.ecmwf.int/codes/grib/param-db/

练习

  1. 创建两个文件

     #include <iostream>
     #include <eccodes.h>
     using namespace std;
    
     int main(int argc, char** argv)
     {
         if(argc < 3)
         {
             cout<<"Usage: "<<argv[0]<<" grib1_path grib2_path";
             return 1;
         }
    
         const char* grib1_path = argv[1];
         const char* grib2_path = argv[2];
    
         const char* sample_filename = "regular_ll_pl_grib2";
         int err = 0;
         codes_handle *h = codes_grib_handle_new_from_samples(nullptr,  sample_filename);
         if(h == nullptr)
         {
             cout<<"ERROR: unable to create handle from sample "<<sample_filename<<endl;
             return 1;
         }
    
         size_t short_name_size;
         codes_get_size(h, "shortName", &short_name_size);
    
         codes_set_string(h, "shortName", "10u", &short_name_size);
    
         size_t value_size;
         codes_get_size(h, "values", &value_size);
    
         auto values = new double[value_size];
         double v = 0;
         for(auto i=0; i<value_size; i++)
         {
             values[i] = v;
             v++;
         }
         // codes_set_long(h, "bitsPerValue", 16);
         codes_set_double_array(h, "values", values, value_size);
    
         codes_write_message(h, grib2_path, "wb");
    
         codes_set_long(h, "edition", 1);
    
         codes_write_message(h, grib1_path, "wb");
    
         delete [] values;
         codes_handle_delete(h);
    
         return 0;
     }
    
  2. 使用 grib_ls -n parameter p.grib1 p.grib2 查看有何不同。

     $ grib_ls -n parameter p.grib1 p.grib2
     p.grib1
     centre      paramId     units       name        shortName   
     ecmf        130         K           Temperature  t          
     1 of 1 messages in p.grib1
    
     p.grib2
     ecmf        130         K           Temperature  t          
     1 of 1 messages in p.grib2
    
     2 of 2 total messages in 2 files
    
  3. 使用 grib_dump -o 比较两个文件不同。

    查看 GRIB 1 文件 p.grib1

     $ grib_dump -O p.grib1
     ***** FILE: p.grib1 
     #==============   MESSAGE 1 ( length=1596 )                ==============
     1-4       identifier = GRIB
     5-7       totalLength = 1596
     8         editionNumber = 1
     ======================   SECTION_1 ( length=52, padding=0 )    ======================
     1-3       section1Length = 52
     4         table2Version = 128
     5         centre = 98 [European Centre for Medium-Range Weather Forecasts (common/c-1.table) ]
     6         generatingProcessIdentifier = 128
     7         gridDefinition = 255
     8         section1Flags = 128 [10000000]
     9         indicatorOfParameter = 165 [10 metre U wind component  (m s**-1)  (grib1/2.98.128.table) ]
     10        indicatorOfTypeOfLevel = 105 [Fixed height above ground height in meters  (2 octets)  (grib1/local/ecmf/3.table , grib1/3.table) ]
     11-12     level = 10
     13        yearOfCentury = 7
     14        month = 3
     15        day = 23
     16        hour = 12
     17        minute = 0
     18        unitOfTimeRange = 1 [Hour (grib1/4.table) ]
     19        P1 = 0
     20        P2 = 0
     21        timeRangeIndicator = 0 [Forecast product valid at reference time + P1  (P1>0)  (grib1/local/ecmf/5.table , grib1/5.table) ]
     22-23     numberIncludedInAverage = 0
     24        numberMissingFromAveragesOrAccumulations = 0
     25        centuryOfReferenceTimeOfData = 21
     26        subCentre = 0 [Unknown code table entry (grib1/0.ecmf.table) ]
     27-28     decimalScaleFactor = 0
     29-40     reservedNeedNotBePresent = 12 {
                       00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
                    } # pad reservedNeedNotBePresent 
     41        localDefinitionNumber = 1 [MARS labelling or ensemble forecast data (grib1/localDefinitionNumber.98.table) ]
     42        marsClass = 1 [Operational archive (mars/class.table) ]
     43        marsType = 2 [Analysis (mars/type.table) ]
     44-45     marsStream = 1025 [Atmospheric model (mars/stream.table) ]
     46-49     experimentVersionNumber = 0001
     50        perturbationNumber = 0
     51        numberOfForecastsInEnsemble = 0
     52        padding_local1_1 = 1 {
                          00
                       } # pad padding_local1_1 
     ======================   SECTION_2 ( length=32, padding=0 )    ======================
     1-3       section2Length = 32
     4         numberOfVerticalCoordinateValues = 0
     5         pvlLocation = 255
     6         dataRepresentationType = 0 [Latitude/Longitude Grid (grib1/6.table) ]
     7-8       Ni = 16
     9-10      Nj = 31
     11-13     latitudeOfFirstGridPoint = 60000
     14-16     longitudeOfFirstGridPoint = 0
     17        resolutionAndComponentFlags = 128 [10000000]
     18-20     latitudeOfLastGridPoint = 0
     21-23     longitudeOfLastGridPoint = 30000
     24-25     iDirectionIncrement = 2000
     26-27     jDirectionIncrement = 2000
     28        scanningMode = 0 [00000000]
     29-32     zero = 
     ======================   SECTION_4 ( length=1500, padding=0 )   ======================
     1-3       section4Length = 1500
     4         dataFlag = 8 [00001000]
     5-6       binaryScaleFactor = -15
     7-10      referenceValue = 0
     11        bitsPerValue = 24
     12-1500   values = (496,1489) {
     ...
     } # data_g1simple_packing values 
     ======================   SECTION_5 ( length=4, padding=0 )     ======================
     1-4       7777 = 7777
    

    查看 GRIB 2 文件 p.grib2

     $ grib_dump -O p.grib2
     ***** FILE: p.grib2 
     #==============   MESSAGE 1 ( length=1667 )                ==============
     1-4       identifier = GRIB
     5-6       reserved = MISSING
     7         discipline = 0 [Meteorological products (grib2/tables/4/0.0.table) ]
     8         editionNumber = 2
     9-16      totalLength = 1667
     ======================   SECTION_1 ( length=21, padding=0 )    ======================
     1-4       section1Length = 21
     5         numberOfSection = 1
     6-7       centre = 98 [European Centre for Medium-Range Weather Forecasts (common/c-11.table) ]
     8-9       subCentre = 0
     10        tablesVersion = 4 [Version implemented on 7 November 2007 (grib2/tables/1.0.table) ]
     11        localTablesVersion = 0 [Local tables not used  (grib2/tables/4/1.1.table) ]
     12        significanceOfReferenceTime = 1 [Start of forecast (grib2/tables/4/1.2.table) ]
     13-14     year = 2007
     15        month = 3
     16        day = 23
     17        hour = 12
     18        minute = 0
     19        second = 0
     20        productionStatusOfProcessedData = 0 [Operational products (grib2/tables/4/1.3.table) ]
     21        typeOfProcessedData = 2 [Analysis and forecast products (grib2/tables/4/1.4.table) ]
     ======================   SECTION_3 ( length=72, padding=0 )    ======================
     1-4       section3Length = 72
     5         numberOfSection = 3
     6         sourceOfGridDefinition = 0 [Specified in Code table 3.1 (grib2/tables/4/3.0.table) ]
     7-10      numberOfDataPoints = 496
     11        numberOfOctectsForNumberOfPoints = 0
     12        interpretationOfNumberOfPoints = 0 [There is no appended list (grib2/tables/4/3.11.table) ]
     13-14     gridDefinitionTemplateNumber = 0 [Latitude/longitude  (Also called equidistant cylindrical, or Plate Carree)  (grib2/tables/4/3.1.table) ]
     15        shapeOfTheEarth = 6 [Earth assumed spherical with radius of 6,371,229.0 m (grib2/tables/4/3.2.table) ]
     16        scaleFactorOfRadiusOfSphericalEarth = MISSING
     17-20     scaledValueOfRadiusOfSphericalEarth = MISSING
     21        scaleFactorOfEarthMajorAxis = MISSING
     22-25     scaledValueOfEarthMajorAxis = MISSING
     26        scaleFactorOfEarthMinorAxis = MISSING
     27-30     scaledValueOfEarthMinorAxis = MISSING
     31-34     Ni = 16
     35-38     Nj = 31
     39-42     basicAngleOfTheInitialProductionDomain = 0
     43-46     subdivisionsOfBasicAngle = MISSING
     47-50     latitudeOfFirstGridPoint = 60000000
     51-54     longitudeOfFirstGridPoint = 0
     55        resolutionAndComponentFlags = 48 [00110000]
     56-59     latitudeOfLastGridPoint = 0
     60-63     longitudeOfLastGridPoint = 30000000
     64-67     iDirectionIncrement = 2000000
     68-71     jDirectionIncrement = 2000000
     72        scanningMode = 0 [00000000]
     ======================   SECTION_4 ( length=34, padding=0 )    ======================
     1-4       section4Length = 34
     5         numberOfSection = 4
     6-7       NV = 0
     8-9       productDefinitionTemplateNumber = 0 [Analysis or forecast at a horizontal level or in a horizontal layer at a point in time (grib2/tables/4/4.0.table) ]
     10        parameterCategory = 2 [Momentum (grib2/tables/4/4.1.0.table) ]
     11        parameterNumber = 2 [u-component of wind  (m s-1)  (grib2/tables/4/4.2.0.2.table) ]
     12        typeOfGeneratingProcess = 0 [Analysis (grib2/tables/4/4.3.table) ]
     13        backgroundProcess = 255
     14        generatingProcessIdentifier = 128
     15-16     hoursAfterDataCutoff = 0
     17        minutesAfterDataCutoff = 0
     18        indicatorOfUnitOfTimeRange = 1 [Hour (grib2/tables/4/4.4.table) ]
     19-22     forecastTime = 0
     23        typeOfFirstFixedSurface = 103 [Specified height level above ground  (m)  (grib2/tables/4/4.5.table) ]
     24        scaleFactorOfFirstFixedSurface = 0
     25-28     scaledValueOfFirstFixedSurface = 10
     29        typeOfSecondFixedSurface = 255 [Missing (grib2/tables/4/4.5.table) ]
     30        scaleFactorOfSecondFixedSurface = MISSING
     31-34     scaledValueOfSecondFixedSurface = MISSING
     ======================   SECTION_5 ( length=21, padding=0 )    ======================
     1-4       section5Length = 21
     5         numberOfSection = 5
     6-9       numberOfValues = 496
     10-11     dataRepresentationTemplateNumber = 0 [Grid point data - simple packing (grib2/tables/4/5.0.table) ]
     12-15     referenceValue = 0
     16-17     binaryScaleFactor = -15
     18-19     decimalScaleFactor = 0
     20        bitsPerValue = 24
     21        typeOfOriginalFieldValues = 0 [Floating point (grib2/tables/4/5.1.table) ]
     ======================   SECTION_6 ( length=6, padding=0 )     ======================
     1-4       section6Length = 6
     5         numberOfSection = 6
     6         bitMapIndicator = 255 [A bit map does not apply to this product (grib2/tables/4/6.0.table) ]
     ======================   SECTION_7 ( length=1493, padding=0 )   ======================
     1-4       section7Length = 1493
     5         numberOfSection = 7
     6-1493    codedValues = (496,1488) {
     ...
     } # data_g2simple_packing codedValues 
     ======================   SECTION_8 ( length=4, padding=0 )     ======================
     1-4       7777 = 7777
    

results matching ""

    No results matching ""