2016-10-04 12 views
0

Java를 사용하여 비행 시뮬레이터에서 grib 데이터를 읽는 작은 라이브러리를 만들려고합니다.GRIB 파일에서 Java 텍스트

이진 파일을 읽고이를 문자열로 변환하는 코드가 작성되었습니다.

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 형식이 아닌 2 진 파일입니다. 또한 데이터가 압축되어 원래 값을 얻으려면 몇 가지 계산을 수행해야합니다.

가 귀하의 질문에 대답하기 위해, 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

감사합니다. 이미 문제를 해결했지만 도움을 주시면 대단히 감사하겠습니다. –