使用 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 = 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 文件有问题?该文件来自国家预报机构,应该没问题。我在随附的屏幕截图中为您提供了 GRIB2 文件的结构(来自 Panoply 软件)。

【问题讨论】:

没人知道吗?由于这个问题,我被困在我的工作项目中:/ PS:我尝试使用有效索引使用getValueAt()interpolateValueAt(),但仍然遇到同样的异常 【参考方案1】:

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

【讨论】:

以上是关于使用 GRIB2Tools 访问 GRIB 数据会导致 IndexOutOfBoundException的主要内容,如果未能解决你的问题,请参考以下文章

从 grib 天气模型中提取数据

在 .NET 中处理 GRIB 数据

使用 cfgrib 加载具有“未知”typeOfLevel 的 GRIB 变量

NDFD GRIB2如何在使用xarray时修复镜像数据

如何使用 Python 绘制 GFS grib2 数据?

Python处理气象信息grib,grib2文件