如何将NetCDF转换为.grd?

问题描述

我有几个NetCDF文件,我希望通过编程将其转换为Surfer 6的“ .Grd”格式。

NetCDF的java library仅能转换为NetCDF,而且我似乎也无法使CDO在Cydwin上正常运行。

如何在Java中转换这些文件(但是使用Windows,而没有Cydwin,...)?

解决方法

我还没有找到可以直接处理文件的Java库,但是有一种方法可以(间接)在Java中执行此操作:

The Generic Mapping Tools可以在Windows中通过命令行使用来转换所述文件。

安装简单:例如,从github并运行它。这将安装所需的所有内容,并设置必要的环境变量(在安装过程中需要勾选)。

之后,可以通过短命令在cmd中运行转换,例如:

gmt grdconvert in.nc out.grd=sf -V

自动检测到输入格式(在我的情况下为NetCDF)。 sf(“ Golden Software Surfer格式6”)指出所需的输出格式。 here可以找到所有受支持的输入/输出格式的概述。我还使用sd(“ Golden Software Surfer格式7”)进行了测试,但这确实是只读的(如链接中所述)。

以上命令要求您首先cd到输入文件,然后再在同一文件夹中创建输出文件。相反,您也可以跳过cd并直接为其指定路径:

gmt grdconvert C:\myfolderpath1\in.nc C:\myfolderpath2\out.grd=sf -V

可以在Java中使用cmd,例如here。在我的案例中,完整的示例如下所示:

Process p = null;
try {
    //final String command = "gmt grdconvert "+in+" "+out+"=sf -V"; //Version 1: cd to folder first,input folder == output folder
    final String command = "gmt grdconvert "+inpath+" "+outpath+"=sf -V"; //Version 2: No cd,different folders possible

    ProcessBuilder builder = new ProcessBuilder(
        //"cmd.exe","/c","cd \""+path+"\" && "+command); // Version 1
        "cmd.exe",command); //Version 2
    builder.redirectErrorStream(true);
    p = builder.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;

    while (true) {
        line = br.readLine();
        if (line == null) { break; }
        System.out.println(line);
    }
        
    br.close();
} catch(IOException e) {
    e.printStackTrace();
} finally {
    if(p!=null) { p.destroy(); }
}

这还将打印由于-V而输出的所有内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...