使用 GRIB2Tools 访问 GRIB 数据会导致 IndexOutOfBoundException

Accessing GRIB data using GRIB2Tools causes IndexOutOfBoundException

我正在处理 GRIB2 预测文件,但在使用 GRIB2Tools 库时遇到问题。

我有一个 Array[Byte] 表示 GRIB2 数据集的内容。因为我希望能够在特定位置获取值,所以我将此变量的内容写入一个文件,然后将其作为 InputStream 加载以与 getValueAtLocation(id, lat, long) and/or interpolateValueAtLocation(id, lat, long)。我可以完美地读取文件的元数据,但是只要我调用这两种方法中的一种,我就会得到一个 IndexOutOfBoundException。

这是我用来在文件上写入 GRIB2 字节数组(变量 bytes)然后将其作为 InputStream 加载的 Scala 代码:

val file: File = new File("my-data.grib")
val temp = FileUtils.writeByteArrayToFile(file, bytes)
val input = new FileInputStream("my-data.grib")
val grib: RandomAccessGribFile = new RandomAccessGribFile("my-grib", "my-data.grib")      
grib.importFromStream(input, 0)

根据 README.md 我做的是对的,不是吗?

然后我可以轻松地从 GRIB2 中获取这些元数据(使用 GRIB2FileTest.java 的一些代码):

Body format : GRIB2
Date: 12.10.2021
Time: 9:0.0
Generating centre: 85
Forecast time: 5
Parameter category: 0
Parameter number: 0
Covered area:
   from (latitude, longitude): 51.47, 348.0
   to: (latitude, longitude): 37.5, 16.0

当用 id = 0lat = 48long = 2 调用 getValueAtLocation(id, lat, long)interpolateValueAtLocation(id, lat, long) 时(在读取元数据时似乎没问题)我得到了这个:

java.lang.IndexOutOfBoundsException
    at java.nio.Buffer.checkIndex(Buffer.java:551)
    at java.nio.HeapByteBuffer.getShort(HeapByteBuffer.java:327)
    at com.ph.grib2tools.grib2file.RandomAccessGribFile.interpolateValueAt(RandomAccessGribFile.java:196)
    at com.ph.grib2tools.grib2file.RandomAccessGribFile.interpolateValueAtLocation(RandomAccessGribFile.java:133)

错误行似乎是此文件中的这一行 RandomAccessGribFile.java:196 :

float val11 = sec5.calcValue(ByteBuffer.wrap(data).getShort((jidx1*gridDefinition.numberPointsLon+iidx1)*bytesperval));

是我做错了什么,还是库源代码或我的 GRIB 文件有问题?文件来自国家预报机构,应该没问题。我在附上的屏幕截图(来自 Panoply 软件)中为您提供了 GRIB2 文件的结构。

在与 Grib2Tools 库的开发人员进行一些研究后,发现问题出在我的 GRIB 文件中。我国的国家预报机构 Météo France 在数据之上添加了一个位图,以指示在给定坐标处是否有可用值。 Grib2Tools 不支持此功能,这会导致数据误解和执行错误。由于开发者的支持,此位图功能将很快得到支持。