【问题标题】:How can I write a _FillValue parameter in a NetCDF CHAR Variable using Java?如何使用 Java 在 NetCDF CHAR 变量中编写 _FillValue 参数?
【发布时间】:2019-11-01 22:38:21
【问题描述】:

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

属性构造函数只接受字符串或数字(或它们的数组),而不接受字符。反正我都试过了,但最终的 netcdf 没有显示属性。

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

我在文档中看到 _FillValue 应该与变量本身的类型相同,但属性值不接受字符,只接受字符串或数字

例如:当我尝试时

    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 文件,它可以工作。

关于这个问题的任何帮助?我错过了什么?

【问题讨论】:

    标签: java netcdf


    【解决方案1】:

    我认为这是由于最新版本的 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 将确保您传入的字符串转换为CHARs,但它不会截断CHARs 的结果集以适应_FillValue 属性的单个字符限制。

    【讨论】:

    • 是的!谢谢肖恩,我尝试了第 5 版,现在可以使用了。我现在必须更新我的代码的某些部分,因为它看起来并不完全兼容,但这对我来说是一个非常好的新功能。
    猜你喜欢
    • 2020-06-02
    • 2017-02-19
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多