【问题标题】:NetCDF-Java: how to write unsigned attribute?NetCDF-Java:如何编写无符号属性?
【发布时间】:2013-06-12 22:15:02
【问题描述】:

我正在尝试使用 NetCDF-Java 4.3 将无符号值写入 nc4 文件中的 valid_range 属性,但它始终写为有符号。这使得查看应用程序无法正确显示数据。示例代码:

Array array = Array.factory(DataType.byte, new int[] { 2 });
array.setUnsigned(true);
array.setObject(0, 0);
array.setObject(1, 255);
Attribute attr = new Attribute("valid_range", array);
log.debug("{}", attr);

打印出来:

valid_range = 0UB, -1UB

但结果文件中该属性的 CDL 是:

colour1:valid_range = 0b, -1b ;

当我在 ToolsUI 4.3 中查看该变量时,它都是空白的,因为所有内容都超出了错误范围。我尝试使用短裤来表示无符号字节;这适用于valid_range,但不适用于_FillValue 属性:

WARN  Nc4Iosp - _FillValue type must agree with var = colour2 type short!=byte

无符号类型应该如何写入属性?

【问题讨论】:

    标签: netcdf


    【解决方案1】:
    1. Netcdf-Java 稳定版是 4.6,而 4.3 已经过时了,尤其是写入 netcdf4。所以你应该看看 4.6 是如何工作的。

    2. Netcdf-Java 版本 5 添加了无符号数据类型以简化此操作,尽管这还不稳定。

    3. 扩大有效范围是一个很好的解决方案。您必须将 _FillValue 保留为与变量相同的类型,但正如您所指出的那样。

    4. 为什么要设置有效范围? IMO,这不是一个好习惯,因为它强制客户端软件检查有效性。除非你真的需要它,否则不要使用它。记录实际范围更有用。

    【讨论】:

    • 这只是为了存储 NODATA 值。我认为我们希望同时支持_FillValue 和valid_range,因为默认情况下,我们的输出文件继承了输入的属性,并且有些文件必须使用该属性。我想我们可以很容易地将它转换为_FillValue。
    【解决方案2】:

    如果变量是无符号的,valid_range 值应该被扩大并存储为无符号整数。

    Array array = Array.factory(DataType.byte, new int[] { 2 });
    

    把它改成……

    Array array = Array.factory(DataType.INT, new int[] { 2 });
    

    这来自 Unidata 的网站。

    https://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html

    【讨论】:

    • 很好的发现。该页面还说_FillValue 属性必须具有与其应用的变量相同的数据类型(未扩展) - 因此没有适合_FillValue 和valid_range 的规则。
    猜你喜欢
    • 2021-11-28
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2022-01-07
    • 2019-11-01
    • 2011-01-17
    相关资源
    最近更新 更多