2016-10-04 20 views
0

JavaScriptを使用してフライトシミュレータからグリブデータを読み込むための小さなライブラリを作成しようとしています。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); 
     } 
} 

ファイルが読み込まれ、ぎこちない結果を返します。誰もが寝台フォーマットに精通していますか?私はそれがASCIIを使用していると思った...

私はNetCDFのようなサードパーティライブラリについて知っています。私が処理しようとしているgribファイルには、限られたデータしか含まれていないため、このファイルを読むための小さなAPIを作成したかったのです。

ありがとうございました!

+0

あなたのasciiBytesToStringメソッドははるかに簡単に行うことができます: 'new String(bytes、" US-ASCII ")' –

+2

GRIBの "B"は "Binary"の略語ですので、ASCIIではありません。何かがASCIIであることを確認するには、非常に簡単です:お気に入りのテキストエディタでファイルを開き、読めるかどうかを確認します。それはあなたのコードとあなたの質問に費やした時間を避けることができました。 GRIBに関するWikipediaの記事を読んでください。 「参照」セクションには、ファイルフォーマットの定義を含むPDFへのリンクが含まれています。 https://en.wikipedia.org/wiki/GRIB –

+0

アーウィン、素晴らしいリソースをありがとうございました。私が見つけたものもあります:https://www.wmo.int/pages/prog/www/WMOCodes/Guides/GRIB/GRIB2_062006.pdf。一つの質問。セクション0(インジケータ)のデコードから始めました。これは私が得るものです( 'System.out.println(bytes [i]);'):** GRIB;規律:0;エディション:2;八重奏におけるGRIBメッセージの長さ:000000 -79 51 **。私は理解していない、なぜ私はここで負の数を取得するのですか?また、月と日には正しい値(** 10 4 **)が得られますが、Yearでは** 7 -32 **が得られます。ありがとうございました! –

答えて

1

GRIBファイルはバイナリ形式であり、ASCII形式ではありません。さらに、データがパックされ、元の値を取得するために数学を行う必要があります。

あなたの質問に答えるために、GRIB2は(IEEE 32ビット浮動小数点形式の)基準値R

  • バイナリスケールファクタE(符号付き整数、以下のコメントを参照してください)
    • を使用しています
    • 小数点以下の桁数D(符号付き整数、下記のコメントを参照)

    元のデータをパックします。基準値Rは負の数を排除するために使用され、スケール係数は必要な精度を達成するために使用されます。仕様によれば、元の値vはGRIB2は、2の補数と互換性のない符号付き整数のための特別な表現を使用する式

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

    注を用いて充填した値pから回収されます。代わりに、GRIB2は符号を表すのに最上位ビットを使用し、符号付き整数の大きさを表す残りのビットを使用します。最上位ビットがセットされている場合、その数は負である。

    詳しくは、http://www.theweatherserver.com/#grib2で関連する文献と仕様のリストを参照してください。

    詳細を調べたくない場合は、https://github.com/philippphb/GRIB2ToolsのGRIB2Tools Javaライブラリを使用して、すべての計算を行い、経度と緯度を使ってデータにアクセスすることができます。

    +0

    ありがとうございます。私はすでに問題を解決していますが、あなたの助けに感謝します。 –

    関連する問題