我正在尝试使用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文件,它将起作用。
有关此问题的任何帮助吗?我想念什么?
答案 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}}属性。