rensheng_ruxi 2020-10-24 09:56 采纳率: 0%
浏览 101

java制作nc文件,时间维度是如何设置的?

仿照一类nc文件,将csv文件制作成nc文件,但时间维度不知道如何设置?示例文件用panoply软件打开是这样的:
图片说明图片说明,现在我已经将时间设置好了,但时间格式不正确,正确的格式是这样的:
图片说明
但我设置的时间格式是这样的:
图片说明
请问是哪里出了问题?而且我看示例文件Time好像是虚拟的,根据Times显示的,我制作 的nc文件的Time不是虚拟的,示我的代码是这样的

Dimension azimuth=fileWriter.addDimension(null, dimension[0], ((List<Double>)listX.get(0)).size());
            Dimension num=fileWriter.addDimension(null, dimension[1], ((int [])listX.get(1)).length);
            Dimension time=fileWriter.addUnlimitedDimension("Time");
            Dimension dateStrLen=fileWriter.addDimension(null,"dateStrLen",19);
            //定义坐标变量
            Variable azimuthVar= fileWriter.addVariable(null, dimension[0],DataType.DOUBLE, dimension[0]);
            Variable numVar= fileWriter.addVariable(null, dimension[1],DataType.DOUBLE, dimension[1]);
            Variable timeVar= fileWriter.addVariable(null, "Time",DataType.DOUBLE, "Time");
            // 定义变量的属性(Attribute)
            fileWriter.addVariableAttribute(azimuthVar, new Attribute("units", "azimuth"));
            fileWriter.addVariableAttribute(numVar, new Attribute("units", "num"));
            fileWriter.addVariableAttribute(timeVar, new Attribute("units", "secs since 1970-01-01 00:00:00"));
            fileWriter.addVariableAttribute(timeVar, new Attribute("long_name", "synthesized time coordinate from Times(time)"));
            fileWriter.addVariableAttribute(timeVar, new Attribute("_CoordinateAxisType", "Time"));
            //定义数据变量
            String dims="Time azimuth num";
            Variable fVar = fileWriter.addVariable(null, "F", DataType.DOUBLE, dims);
            Variable bIVar = fileWriter.addVariable(null, "BI", DataType.DOUBLE, dims);
            Variable timesVar = fileWriter.addVariable(null, "Times", DataType.CHAR, "Time dateStrLen");
            // 定义数据属性(Attribute)
            fileWriter.addVariableAttribute(fVar, new Attribute("units", "F"));
            fileWriter.addVariableAttribute(bIVar, new Attribute("units", "BI"));
            //定义一维数组(为坐标设定数值)
            ArrayDouble.D1 azimuthX = new ArrayDouble.D1(((List<Double>)listX.get(0)).size());
            ArrayDouble.D1 numY = new ArrayDouble.D1(((int [])listX.get(1)).length);
            //填充值
            int i, j;
            for (i = 0; i < azimuth.getLength(); i++) {
                azimuthX.set(i, ((List<Double>)listX.get(0)).get(i));
            }
            for (j = 0; j < num.getLength(); j++) {
                numY.set(j, ((int [])listX.get(1))[j]);
            }
            // 定义2维数组(为数据设定值)
            ArrayDouble.D3 dataF = new ArrayDouble.D3(1,azimuth.getLength(), num.getLength());
            ArrayDouble.D3 dataBI = new ArrayDouble.D3(1,azimuth.getLength(), num.getLength());
            String [][] f =(String [][])list.get(0);
            String [][] bi =(String [][])list.get(1);
            for(int tim=0;tim<1;tim++){
                for (int azi = 0; azi < azimuth.getLength(); azi++) {
                    for (int n = 0; n < num.getLength(); n++){
                        dataF.set(tim, azi , n , Double.parseDouble(f[azi][n]) );
                        dataBI.set( tim,azi, n, Double.parseDouble(bi[azi][n]) );
                    }
                }
            }

望指导一下,时间维度怎么设置?我哪里设置有问题?

  • 写回答

1条回答 默认 最新

  • 数据大魔王 2023-06-13 09:27
    关注

    在Java中创建NC(NetCDF)文件时,可以使用NetCDF-Java库来进行操作。要设置时间维度,可以遵循以下步骤:

    导入必要的类和库:

    Java中创建NC(NetCDF)文件时,可以使用NetCDF-Java库来进行操作。要设置时间维度,可以遵循以下步骤:
    
    导入必要的类和库:
    
    

    创建NetCDF文件:

    String filePath = "path/to/your/file.nc";
    NetcdfFileWriter writer = NetcdfFileWriter.createNew(NetcdfFileWriter.Version.netcdf3, filePath);
    
    

    创建维度:

    int timeSize = 100; // 设置时间维度的大小
    Dimension timeDim = writer.addDimension(null, "time", timeSize);
    
    

    在上述示例中,创建了一个名为"time"的维度,其大小为100。

    创建时间变量:

    Variable timeVar = writer.addVariable(null, "time", DataType.DOUBLE, "time");
    
    

    在上述示例中,创建了一个名为"time"的变量,其数据类型为DOUBLE,并将"time"作为维度。

    设置时间变量的属性:

    timeVar.addAttribute(new Attribute("units", "seconds since 1970-01-01T00:00:00Z"));
    
    

    在上述示例中,设置了时间变量的单位属性为"seconds since 1970-01-01T00:00:00Z",你可以根据需要修改单位。

    写入数据到时间变量:

    Array timeData = Array.factory(DataType.DOUBLE, new int[]{timeSize});
    // 在此处填充时间数据到timeData数组
    writer.write(timeVar, timeData);
    
    

    根据你的需求,创建一个数组 timeData 并填充时间数据。

    关闭NetCDF文件:

    
    writer.close();
    

    完成上述步骤后,将会生成一个包含时间维度和相应数据的NC文件。

    评论

    报告相同问题?

    悬赏问题

    • ¥15 如何在EXCEL某单元格中查找是否存在另一列中的内容。
    • ¥50 非对称加密(相关搜索:密码学)
    • ¥15 关于非编程寻迹小车的分析
    • ¥15 java导出EXCEL这里已经执行成功了,但是流浪器没有下载
    • ¥15 帮我把代码改的能正常运行就行
    • ¥50 有限元修正、模型修正、最小二乘法,详细步骤
    • ¥15 用plc编写梯形程序
    • ¥15 关于#物联网#的问题:新大陆AIOT中,按照手册教程进行添加,设置完成后网关一直不上线,显示Never这是网络服务的信息
    • ¥15 这个要用一维热方程但是我不知道怎么运用这个公式
    • ¥15 OpenFOAM多孔介质传热模型建模