首页 文章

GRIB文件到Java中的文本

提问于
浏览
0

我正在尝试创建一个小型库,以便使用Java从飞行模拟器中读取grib数据 .

创建了一个代码来读取二进制文件并将其转换为字符串 .

public class MainClass 
{
    final static String FILE_NAME = "PATH\\global_winds.grib";

    public static void main(String... aArgs) throws IOException
    {

        MainClass binary = new MainClass();
        byte[] bytes = binary.readFile(FILE_NAME);

        String myString = asciiBytesToString(bytes);

        System.out.println(myString);
    }

    byte[] readFile(String aFileName) throws IOException 
    {
        Path path = Paths.get(aFileName);
        return Files.readAllBytes(path);
    }


    public static String asciiBytesToString( byte[] bytes )
    {
          if ( (bytes == null) || (bytes.length == 0 ) )
          {
              return "";
          }

          char[] result = new char[bytes.length];

          for ( int i = 0; i < bytes.length; i++ )
          {
              result[i] = (char)bytes[i];
          }

          return new String( result );
      }
}

该文件被读取并返回乱码 . 有人熟悉grib格式吗?我以为它是用ASCII ...

我知道像NetCDF这样的第三方库 . 我试图处理的grib文件包含有限的数据,我真的想制作一个小API来读取这个文件 .

谢谢!

1 回答

  • 1

    GRIB文件是二进制文件,而不是ASCII格式 . 此外,数据已打包,您需要进行一些数学运算才能获得原始值 .

    为了回答你的问题,GRIB2使用

    • a参考值R(IEEE 32位浮点格式)

    • 二进制比例因子E(有符号整数,见下面的注释)

    • 小数比例因子D(有符号整数,见下面的注释)

    打包原始数据 . 参考值R用于消除负数,比例因子用于实现所需的精度 . 根据规范,使用公式从打包值 p 恢复原始值 v

    v = R + p * 2^E / 10^D
    

    请注意,GRIB2对有符号整数使用特殊表示,这与二进制补码不兼容 . 相反,GRIB2使用最高有效位表示符号,其余位用于表示有符号整数的大小 . 如果设置了最高有效位,则该数字为负数 .

    如果您想了解更多细节,可以在http://www.theweatherserver.com/#grib2找到相关文献和规格的清单 .

    如果您不想查看详细信息,可以使用https://github.com/philippphb/GRIB2Tools中的GRIB2Tools Java库,它可以完成所有数学运算并允许使用经度和纬度访问数据 .

相关问题