使用 GRIB2Tools 访问 GRIB 数据会导致 IndexOutOfBoundException
Posted
技术标签:
【中文标题】使用 GRIB2Tools 访问 GRIB 数据会导致 IndexOutOfBoundException【英文标题】:Accessing GRIB data using GRIB2Tools causes IndexOutOfBoundException 【发布时间】:2021-12-01 23:32:08 【问题描述】:我正在处理 GRIB2 预测文件,但在使用 GRIB2Tools 库时遇到问题。
我有一个 Array[Byte]
代表 GRIB2 数据集的内容。因为我希望能够在特定位置获取值,所以我将此变量的内容写入一个文件,然后将其作为InputStream
加载,以便与getValueAtLocation(id, lat, long)
和/或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 文件有问题?该文件来自国家预报机构,应该没问题。我在随附的屏幕截图中为您提供了 GRIB2 文件的结构(来自 Panoply 软件)。
【问题讨论】:
没人知道吗?由于这个问题,我被困在我的工作项目中:/ PS:我尝试使用有效索引使用getValueAt()
和interpolateValueAt()
,但仍然遇到同样的异常
【参考方案1】:
在对 Grib2Tools 库的开发人员进行一些研究后,发现问题出在我的 GRIB 文件中。我国的国家预报机构法国气象局在数据之上添加了一个位图,以指示在给定坐标处是否有可用值。 Grib2Tools 不支持此功能,这会导致数据误解和执行错误。感谢开发者,此位图功能将很快得到支持。
【讨论】:
以上是关于使用 GRIB2Tools 访问 GRIB 数据会导致 IndexOutOfBoundException的主要内容,如果未能解决你的问题,请参考以下文章