我正在操作GRIB2预测文件,并且在使用GRIB2Tools库时遇到了问题。
我有一个表示GRIB2数据集内容的Array[Byte]。因为我希望能够在特定位置获得值,所以我将此变量的内容写入一个文件,然后将其作为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软件)。

发布于 2021-10-20 07:21:08
在对Grib2Tools库的开发人员进行了一些研究之后,发现问题来自于我的GRIB文件。我的国家的国家预测组织,法国气象局,在数据上添加了一个位图,以表明在给定的坐标下是否有可用的值。Grib2Tools不支持此功能,这会导致数据误解和执行错误。多亏了dev,这个位图特性很快就会得到支持。
https://stackoverflow.com/questions/69556298
复制相似问题