【发布时间】:2021-02-23 14:18:29
【问题描述】:
我有几个 NetCDF 文件,我想以编程方式转换为 Surfer 6 的“.grd”格式。
NetCDF 的 java library 只能转换为 NetCDF,我似乎也无法让 CDO 与 Cydwin 一起正常运行。
如何在 java 中转换这些文件(但使用 Windows,没有 Cydwin,...)?
【问题讨论】:
标签: java netcdf netcdf-java
我有几个 NetCDF 文件,我想以编程方式转换为 Surfer 6 的“.grd”格式。
NetCDF 的 java library 只能转换为 NetCDF,我似乎也无法让 CDO 与 Cydwin 一起正常运行。
如何在 java 中转换这些文件(但使用 Windows,没有 Cydwin,...)?
【问题讨论】:
标签: java netcdf netcdf-java
我还没有找到直接处理文件的 java 库,但是有一种方法可以(间接)在 java 中执行此操作:
The Generic Mapping Tools 可以在 Windows 中通过命令行来转换所述文件。
安装很简单:从例如下载他们的 exe。 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", "/c", 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 输出的所有内容打印到控制台。
【讨论】: