在Grib2文件中经度为负值时获取错误的值

时间:2015-10-14 05:13:43

标签: c# grib

我正在研究移动天气应用程序,我正在阅读来自NOAA服务器的 Grib2 文件的天气信息。一切都很好,我得到了所有天气信息并绘制到地图上。

现在,我有一个场景,我正在获得负经度值。如下图所示:

Negative Value

注意:

我正在使用GribCS库从Grib File中提取天气信息,如果经度值 11 而非 -11 ,这似乎是完美的。我用以下方式提取值:

    void GribTwo()
    {
        #region Grib 2 Code

        Grib2Input input = new Grib2Input(RandomAccessFile);

        if (!input.scan(false, false))
        {
            Console.WriteLine("Failed to successfully scan grib file");
            return;
        }
        Grib2Data data = new Grib2Data(RandomAccessFile);

        var records = input.Records;

        foreach (Grib2Record record in records)
        {
            IGrib2IndicatorSection iis = record.Is;
            IGrib2IdentificationSection id = record.ID;
            IGrib2ProductDefinitionSection pdsv = record.PDS;
            IGrib2GridDefinitionSection gdsv = record.GDS;

            float[] values = data.getData(record.getGdsOffset(), record.getPdsOffset());

            if ((iis.Discipline == 0) && (pdsv.ParameterCategory == 2) && (pdsv.ParameterNumber == 2))
            {
                // U-component_of_wind
                int c = 0;
                for (double lat = gdsv.La1; lat <= gdsv.La2; lat = lat - gdsv.Dy)
                {
                    //THIS is  gdsv.Lo1; always has wrong values. 349 value instead -11 whuile Lo2 has correct value 7.
                    for (double lon = gdsv.Lo1; lon <= gdsv.Lo2; lon = lon + gdsv.Dx)
                    {
                        Console.WriteLine("U-Wind " + lat + "\t" + lon + "\t" + values[c]);
                        c++;
                    }
                }
            }

        #endregion
    }

正如我在内部循环中提到的那样,起点gdsv.Lo1;在这种情况下有错误的值它有349而不是-11导致问题。

深入挖掘时,我发现以下方法基本上从流中读取值并转换为可读形式。

    public static int int4(System.IO.Stream raf)
    {
        int a = raf.ReadByte();
        int b = raf.ReadByte();
        int c = raf.ReadByte();
        int d = raf.ReadByte();

        // all bits set to ones
        if (a == 0xff && b == 0xff && c == 0xff && d == 0xff)
            return UNDEFINED;

        int i2 = (1 - ((a & 128) >> 6)) * ((a & 127) << 24 | b << 16 | c << 8 | d);
        return i2;
    }
    //This method is available under GribNumbers.cs in GribCS library.

我不明白,有什么东西让我读错了吗?

2 个答案:

答案 0 :(得分:2)

我使用相同的库GribApi.Net由于开发不足,现在它有点儿错误,但是,您可以使用它来验证数据或找到更好的解决方案来解决现有库中的问题。

答案 1 :(得分:1)

尝试This我累了,它也提取了那些负值。

Result

干杯!!