问题描述
我有几个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
而输出的所有内容。