使用 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 = 0
和 lat = 48
和 long = 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 不支持此功能,这会导致数据误解和执行错误。由于开发者的支持,此位图功能将很快得到支持。
我正在处理 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 = 0
和 lat = 48
和 long = 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 不支持此功能,这会导致数据误解和执行错误。由于开发者的支持,此位图功能将很快得到支持。