netcdf数据nc格式数据java解析总结(三)使用java生成.nc格式文件

我也忘了当时从哪看的资料了。。 应该是官网 ,但是具体链接还没翻出来。。

好像当初是参考了这里,注解写的也很详细  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();
		}
	}


你可能感兴趣的:(工作)