我也忘了当时从哪看的资料了。。 应该是官网 ,但是具体链接还没翻出来。。
好像当初是参考了这里,注解写的也很详细 http://blog.csdn.net/qq_19794303/article/details/59112856 点击打开链接
前一阵总用,现在有点忘。。哪里写错了勿喷,下面贴一下我的一个类。
写文件和读文件其实差不多,读相当于打开,写嘛就是拼上。
因为要生成各种不同nc文件,为了方便我写了一个工具类,各种方法用的时候直接调用传个参数就行。
我们依然用冰箱来打比方吧。
首先 新建一个冰箱打开(好牵强~~!!)
这里就是新建一个NetcdfFileWriter 类型的writer
NetcdfFileWriter writer=NetcdfFileWriter.createNew(NetcdfFileWriter.Version.netcdf3, filepath, null);
//filepath 写绝对路径。比如D:/xxx.nc 你得告诉人家冰箱在哪里才能放大象啊,因为是生成netcdf文件所以文件后缀一定要加.nc啊,如果这个文件已存在就会重写覆盖,没有就会新建一个。
第二大步 把大象放进去(好牵强+10086!!)
这里就是把数据放到文件里。。
step1加维度
待编辑
step2加变量
待编辑
step3加全局变量
可有可无,感觉相当于变量的一些说明
第五步 数据存到相应位置
待编辑写入数据
writer.create();
writer.write();
第三步 把冰箱门带上
关掉writer.close();
下面是我的一个代码供参考,没优化,变量起名也很随意,凑合看。。参数根据需求写吧,这是传了只有一个变量名的,多种变量就传个别的循环一下。我传的分别是:生成的文件路径,NC变量名,y长度,x长度,数据map的,二维数组经度,二维数组纬度
String filepath, String varname, int ylength,
int xlength, Map sszs, float[][] lon,
float[][] lat
public static void toNCfile(String filepath, String varname, int ylength,
int xlength, Map sszs, float[][] lon,
float[][] lat) {
NetcdfFileWriter writer;
try {
writer = NetcdfFileWriter.createNew(
NetcdfFileWriter.Version.netcdf3, filepath, null);
// add dimensions
Dimension time = writer.addDimension(null, "time", 15);
Dimension latDim = writer.addDimension(null, "y", 581);
Dimension lonDim = writer.addDimension(null, "x", 511);
// add Variable double temperature(lat,lon)
List dims = new ArrayList();// lon lat
List dims2 = new ArrayList();// data
dims.add(latDim);
dims.add(lonDim);
dims2.add(time);
dims2.add(latDim);
dims2.add(lonDim);
Variable lonn = writer.addVariable(null, "lon", DataType.FLOAT,
dims);
Variable latt = writer.addVariable(null, "lat", DataType.FLOAT,
dims);
lonn.addAttribute(new Attribute("units", "Degrees_east"));
latt.addAttribute(new Attribute("units", "Degrees_north"));
Variable index=null;
index = writer.addVariable(null, varname + "index",
DataType.INT, dims2);
index.addAttribute(new Attribute("units", "")); // add a 1D
// attribute
// of length
// 3
index.addAttribute(new Attribute("description", varname
+ "index")); // add a 1D attribute of length 3
// add global attributes
writer.addGroupAttribute(null, new Attribute(
"FORECAST_LENGTH_IN_HR", 15));
writer.addGroupAttribute(null, new Attribute(
"SOUTH-NORTH_GRID_DIMENSION", 581));
writer.addGroupAttribute(null, new Attribute(
"WEST-EAST_GRID_DIMENSION", 511));
writer.addGroupAttribute(null,
new Attribute("TITLE", varname.toUpperCase() + " INDEX "));
int[] shape = index.getShape();
ArrayFloat A = new ArrayFloat.D3(shape[0], shape[1], shape[2]);
ArrayFloat B = new ArrayFloat.D2(shape[1], shape[2]);
ArrayFloat C = new ArrayFloat.D2(shape[1], shape[2]);
ArrayFloat D = new ArrayFloat.D3(shape[0], shape[1], shape[2]);
int i, j, t;
Index ima = A.getIndex();
Index imab = B.getIndex();
Index imac = C.getIndex();
for (t = 0; t < shape[0]; t++) {
for (i = 0; i < shape[1]; i++) {
for (j = 0; j < shape[2]; j++) {
D.setFloat(ima.set(t, i, j), sszs.get(t)[i][j]);
}
}
}
for (i = 0; i < shape[1]; i++) {
for (j = 0; j < shape[2]; j++) {
B.setFloat(imab.set(i, j), lon[i][j]);
C.setFloat(imac.set(i, j), lat[i][j]);
}
}
int[] origin = new int[3];
int[] origin2 = new int[2];
int[] origin3 = new int[2];
try {
writer.create();
writer.write(lonn, origin2, B);
writer.write(latt, origin3, C);
writer.write(index, origin, D);
} catch (IOException e) {
System.err.println("ERROR writing file");
} catch (InvalidRangeException e) {
e.printStackTrace();
} finally{
writer.close();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}