如何使用Java在NetCDF CHAR变量中写入_FillValue参数?

时间:2019-06-19 08:38:04

标签: java netcdf

我正在尝试使用Java(统一数据库)创建NetCDF文件。要求之一是在所有变量中都包含_FillValue属性。我有一个CHAR类型,但是我做不到。

属性构造函数仅接受字符串或数字(或它们的数组),而不接受字符。无论如何,我都尝试过这两个方法,但是最终的netcdf没有显示该属性。

其他语言可以让您做到这一点(我们已经在Matlab中看到了这一点),但是我不知道如何使用Java来做到这一点。

我在文档中看到_FillValue应该与变量本身具有相同类型,但是Attribute值不接受Chars,仅接受String或Numbers

例如:当我尝试

    Nc4Chunking chunker = Nc4ChunkingStrategy.factory(Nc4Chunking.Strategy.standard, 6, true);
    NetcdfFileWriter dataFile = NetcdfFileWriter.createNew(NetcdfFileWriter.Version.netcdf4_classic, fileName, chunker);
....
    Variable varid_scdr = dataFile.addVariable(null, "SCDR", DataType.CHAR, dimsTMS15);
    varid_scdr.addAttribute(new Attribute("_FillValue", " "));
....
    dataFile.write(varid_scdr, scodData);
    dataFile.close();

生成的netcdf文件没有_FillValue,它没有写入文件中。 但是,如果我更改属性名称并执行此操作

    varid_scdr.addAttribute(new Attribute("FillValue", " "));

该参数存在于输出文件中

我对其他数据类型或其他属性名称没有任何问题。我非常确定问题出在Char类型的属性_FillValue上。我不知道如何编写它,我需要_FillValue属性明确显示在变量属性列表中。

********* 2019年7月5日***********

我意识到问题仅与netcdf4和netcdf4_classic文件有关。所以也许是关于分块之类的。如果我尝试创建netcdf3文件,它将起作用。

有关此问题的任何帮助吗?我想念什么?

1 个答案:

答案 0 :(得分:0)

我认为这是由于netcdf-java(v5.0.0)最新版本中已解决的错误所致。 v5.0.0已发布并可以下载;我希望该公告将在今天发布。

如果您想明确地编写一个CHAR值属性,一种实现方法是:

String fillValue = " ";
Array charArrayFillValue = ArrayChar.makeFromString(fillValue, 1);
charAttrFillValue = new Attribute("_FillValue", charArrayFillValue);
varid_scdr.addAttribute(charAttrFillValue)

另一种方式是:

String fillValue = " ";
Array charArrayFillValue = ArrayChar.makeFromString(fillValue, 1);
charAttrFillValue = new Attribute("_FillValue", DataType.CHAR);
charAttrFillValue.setValues(charArrayFillValue);
varid_scdr.addAttribute(charAttrFillValue)

尽管这两个都有些冗长。我刚刚使用版本5进行了检查,您的那支班轮纸可以正常工作

varid_scdr.addAttribute(new Attribute("_FillValue", " "));

但是,如果您尝试为_FillValue传递一个不是长度为1的字符串的值,则netCDF-C库将引发错误。所以这个:

varid_scdr.addAttribute(new Attribute("_FillValue", "ab"));

将导致:

-36 (NetCDF: Invalid argument) on attribute ':_FillValue = "ab"' on var varid_scdr

netCDF-Java将确保您传递的字符串被转换为CHAR,但是不会截断CHAR的结果集以适应{ {1}}属性。