需要一个jar包
E:\ServerFiles\Hebei\workspace\Demo1\WebContent\WEB-INF\lib\netcdfAll-4.6.10.jar
public static void createNCfile(String[] str1,String filepath1,int width,int height,float lonWest,float latSouth,float gridInterval,List<float[][]> Dewpoint_temperature ,List<float[][]> Pressure ,List<float[][]> Relative ,List<float[][]> Temperature, List<float[][]> Total_precipitation, List<float[][]> Wind ,List<float[][]> Wind_speed, List<float[][]> u_component_of_wind_height, List<float[][]> u_component_of_wind_gust ,List<float[][]> v_component_of_wind ,List<float[][]> v_component_of_wind_gust){
//创建netcdf3写入文件对象
NetcdfFileWriter fileWriter;
try {
fileWriter = NetcdfFileWriter.createNew(Version.netcdf3, filepath1);
//分别创建经度和纬度方向的维度,lon的宽度为width,lat高度为height,并命名为lon和lat
Dimension xdim=fileWriter.addDimension(null, "lon", width);
Dimension ydim=fileWriter.addDimension(null, "lat", height);
Dimension time=fileWriter.addDimension(null, "time", 1);
Dimension grounp=fileWriter.addDimension(null, "height_above_ground", 1);
Dimension grounp1=fileWriter.addDimension(null, "height_above_ground1", 1);
//通过一维组合成二维array list
ArrayList<Dimension> dims_Dewpoint_temperature=new ArrayList<Dimension>();
ArrayList<Dimension> dims_Pressure=new ArrayList<Dimension>();
ArrayList<Dimension> dims_Relative=new ArrayList<Dimension>();
ArrayList<Dimension> dims_Temperature=new ArrayList<Dimension>();
ArrayList<Dimension> dims_Total_precipitation=new ArrayList<Dimension>();
ArrayList<Dimension> dims_Wind=new ArrayList<Dimension>();
ArrayList<Dimension> dims_Wind_speed=new ArrayList<Dimension>();
ArrayList<Dimension> dims_u_component_of_wind_height=new ArrayList<Dimension>();
ArrayList<Dimension> dims_u_component_of_wind_gust=new ArrayList<Dimension>();
ArrayList<Dimension> dims_v_component_of_wind=new ArrayList<Dimension>();
ArrayList<Dimension> dims_v_component_of_wind_gust=new ArrayList<Dimension>();
//注意这里add的顺序很重要,一定要和数据对应,如果把list顺序调换,那么二维的维度也会不同,相当于数学中的坐标系,第一个是x坐标,第二个是y坐标,x宽度为width,y高度为height
dims_Dewpoint_temperature.add(time);
dims_Dewpoint_temperature.add(grounp1);
dims_Dewpoint_temperature.add(xdim);
dims_Dewpoint_temperature.add(ydim);
dims_Pressure.add(time);
dims_Pressure.add(xdim);
dims_Pressure.add(ydim);
dims_Relative.add(time);
dims_Relative.add(grounp);
dims_Relative.add(xdim);
dims_Relative.add(ydim);
dims_Temperature.add(time);
dims_Temperature.add(grounp);
dims_Temperature.add(xdim);
dims_Temperature.add(ydim);
dims_Total_precipitation.add(time);
dims_Total_precipitation.add(xdim);
dims_Total_precipitation.add(ydim);
dims_Wind.add(time);
dims_Wind.add(grounp);
dims_Wind.add(xdim);
dims_Wind.add(ydim);
dims_Wind_speed.add(time);
dims_Wind_speed.add(grounp);
dims_Wind_speed.add(xdim);
dims_Wind_speed.add(ydim);
dims_u_component_of_wind_height.add(time);
dims_u_component_of_wind_height.add(grounp);
dims_u_component_of_wind_height.add(xdim);
dims_u_component_of_wind_height.add(ydim);
dims_u_component_of_wind_gust.add(time);
dims_u_component_of_wind_gust.add(grounp);
dims_u_component_of_wind_gust.add(xdim);
dims_u_component_of_wind_gust.add(ydim);
dims_v_component_of_wind.add(time);
dims_v_component_of_wind.add(grounp);
dims_v_component_of_wind.add(xdim);
dims_v_component_of_wind.add(ydim);
dims_v_component_of_wind_gust.add(time);
dims_v_component_of_wind_gust.add(grounp);
dims_v_component_of_wind_gust.add(xdim);
dims_v_component_of_wind_gust.add(ydim);
//创建名称为lon的变量,类型为folat,对应的维度为lon,对应Dimension里面定义的名称为"lon"的那个
Variable vx=fileWriter.addVariable(null, "lon", DataType.FLOAT, "lon");
//给vx变量加上数据说明,全程long_name
fileWriter.addVariableAttribute(vx, new Attribute("long_name","longitude" ));
//给vx变量加上units,对应的Degree_east,如果不加units为Degree_east(东经),则不是地理坐标系,这个很重要
fileWriter.addVariableAttribute(vx, new Attribute("units","Degrees_east" ));
Variable vy=fileWriter.addVariable(null, "lat", DataType.FLOAT, "lat");
fileWriter.addVariableAttribute(vy, new Attribute("long_name","latitude" ));
//给vy变量加上units,对应的Degree_north,如果不加units为Degree_north(北纬),则不是地理坐标系,这个很重要
fileWriter.addVariableAttribute(vy, new Attribute("units","Degrees_north" ));
Variable vtime=fileWriter.addVariable(null, "time", DataType.DOUBLE, "time");
fileWriter.addVariableAttribute(vtime, new Attribute("long_name","time"));
fileWriter.addVariableAttribute(vtime, new Attribute("units","Hour since 2021-04-26T04:00:00Z"));
Variable vgrounp=fileWriter.addVariable(null, "height_above_ground", DataType.FLOAT, "height_above_ground");
fileWriter.addVariableAttribute(vgrounp, new Attribute("long_name","height_above_ground"));
fileWriter.addVariableAttribute(vgrounp, new Attribute("units","m"));
Variable vgrounp1=fileWriter.addVariable(null, "height_above_ground1", DataType.FLOAT, "height_above_ground1");
fileWriter.addVariableAttribute(vgrounp1, new Attribute("long_name","height_above_ground1"));
fileWriter.addVariableAttribute(vgrounp1, new Attribute("units","m"));
//创建变量名称为var的变量,对应的维度为dims,该dims为上面定义的一个ArrayList<Diminsion>,该list包含2个维度,经度和维度
Variable v_dims_Dewpoint_temperature=fileWriter.addVariable(null, str1[0], DataType.FLOAT, dims_Dewpoint_temperature);
fileWriter.addVariableAttribute(v_dims_Dewpoint_temperature, new Attribute("long_name","露点温度" ));
fileWriter.addVariableAttribute(v_dims_Dewpoint_temperature, new Attribute("units","K" ));
Variable v_dims_Pressure=fileWriter.addVariable(null, str1[1], DataType.FLOAT, dims_Pressure);
fileWriter.addVariableAttribute(v_dims_Pressure, new Attribute("long_name","压力" ));
fileWriter.addVariableAttribute(v_dims_Pressure, new Attribute("units","Pa" ));
Variable v_dims_Relative=fileWriter.addVariable(null, str1[2], DataType.FLOAT, dims_Relative);
fileWriter.addVariableAttribute(v_dims_Relative, new Attribute("long_name","相对湿度" ));
fileWriter.addVariableAttribute(v_dims_Relative, new Attribute("units","%" ));
Variable v_dims_Temperature=fileWriter.addVariable(null, str1[3], DataType.FLOAT, dims_Temperature);
fileWriter.addVariableAttribute(v_dims_Temperature, new Attribute("long_name","地上温度" ));
fileWriter.addVariableAttribute(v_dims_Temperature, new Attribute("units","K" ));
Variable v_dims_Total_precipitation=fileWriter.addVariable(null, str1[4], DataType.FLOAT, dims_Total_precipitation);
fileWriter.addVariableAttribute(v_dims_Total_precipitation, new Attribute("long_name","总降水量" ));
fileWriter.addVariableAttribute(v_dims_Total_precipitation, new Attribute("units","kg.m-2" ));
Variable v_dims_Wind=fileWriter.addVariable(null, str1[5], DataType.FLOAT, dims_Wind);
fileWriter.addVariableAttribute(v_dims_Wind, new Attribute("long_name","风向" ));
fileWriter.addVariableAttribute(v_dims_Wind, new Attribute("units","degree_true" ));
Variable v_dims_Wind_speed=fileWriter.addVariable(null, str1[6], DataType.FLOAT, dims_Wind_speed);
fileWriter.addVariableAttribute(v_dims_Wind_speed, new Attribute("long_name","风速" ));
fileWriter.addVariableAttribute(v_dims_Wind_speed, new Attribute("units","m/s" ));
Variable v_dims_u_component_of_wind_height=fileWriter.addVariable(null, str1[7], DataType.FLOAT, dims_u_component_of_wind_height);
fileWriter.addVariableAttribute(v_dims_u_component_of_wind_height, new Attribute("long_name","地上风高度的u分量" ));
fileWriter.addVariableAttribute(v_dims_u_component_of_wind_height, new Attribute("units","m/s" ));
Variable v_dims_u_component_of_wind_gust=fileWriter.addVariable(null, str1[8], DataType.FLOAT, dims_u_component_of_wind_gust);
fileWriter.addVariableAttribute(v_dims_u_component_of_wind_gust, new Attribute("long_name","风、阵风、离地高度的u分量" ));
fileWriter.addVariableAttribute(v_dims_u_component_of_wind_gust, new Attribute("units","m/s" ));
Variable v_dims_v_component_of_wind=fileWriter.addVariable(null, str1[9], DataType.FLOAT, dims_v_component_of_wind);
fileWriter.addVariableAttribute(v_dims_v_component_of_wind, new Attribute("long_name","地上风力高度的v分量" ));
fileWriter.addVariableAttribute(v_dims_v_component_of_wind, new Attribute("units","m/s" ));
Variable v_dims_v_component_of_wind_gust=fileWriter.addVariable(null, str1[10], DataType.FLOAT, dims_v_component_of_wind_gust);
fileWriter.addVariableAttribute(v_dims_v_component_of_wind_gust, new Attribute("long_name","风、阵风、地上高度的v分量" ));
fileWriter.addVariableAttribute(v_dims_v_component_of_wind_gust, new Attribute("units","m/s" ));
//使用create()来创建该文件,只有create之后才能在文件夹中显示该文件,并且写入数据
fileWriter.create();
//创建x和y方向上的变量。D1 代表一维
ArrayFloat xvalues=new ArrayFloat.D1(width);
ArrayFloat yvalues=new ArrayFloat.D1(height);
ArrayFloat timevalues=new ArrayFloat.D1(1);
ArrayFloat grounpvalues = new ArrayFloat.D1(1);
ArrayFloat grounp1values = new ArrayFloat.D1(1);
for (int i = 0; i < width; i++) {
xvalues.setFloat(i, (float) (lonWest+gridInterval*i));
}
for (int j = 0; j < height; j++) {
yvalues.setFloat(j, (float) (latSouth+gridInterval*j));
}
timevalues.setInt(0, 0);
grounpvalues.setInt(0, 0);
grounp1values.setInt(0, 0);
//创建网格上的变量,D3代表3维,用(1,width, height)来描述他的定义域,这个顺序必须和ArrayList<Dimension> 加载的顺序一一对应,否则会出错
ArrayFloat values_Dewpoint_temperature=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_Pressure=new ArrayFloat.D3(1,width, height);
ArrayFloat values_Relative=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_Temperature=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_Total_precipitation=new ArrayFloat.D3(1,width, height);
ArrayFloat values_Wind=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_Wind_speed=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_u_component_of_wind_height=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_u_component_of_wind_gust=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_v_component_of_wind=new ArrayFloat.D4(1,1,width, height);
ArrayFloat values_v_component_of_wind_gust=new ArrayFloat.D4(1,1,width, height);
Index index_Dewpoint_temperature=values_Dewpoint_temperature.getIndex();
Index index_Pressure=values_Pressure.getIndex();
Index index_Relative=values_Relative.getIndex();
Index index_Temperature=values_Temperature.getIndex();
Index index_Total_precipitation=values_Total_precipitation.getIndex();
Index index_Wind=values_Wind.getIndex();
Index index_Wind_speed=values_Wind_speed.getIndex();
Index index_u_component_of_wind_height=values_u_component_of_wind_height.getIndex();
Index index_u_component_of_wind_gust=values_u_component_of_wind_gust.getIndex();
Index index_v_component_of_wind=values_v_component_of_wind.getIndex();
Index index_v_component_of_wind_gust=values_v_component_of_wind_gust.getIndex();
for (int n = 0; n < 1; n++) {
for (int k = 0; k < 1; k++) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
//将二维数组[i][j]处的数据写入网格的i,j处
values_Dewpoint_temperature.setFloat(index_Dewpoint_temperature.set(n,k,i, j), Dewpoint_temperature.get(k)[i][j]);
values_Relative.setFloat(index_Relative.set(n,k,i,j), Pressure.get(k)[i][j]);
values_Temperature.setFloat(index_Temperature.set(n,k,i,j), Temperature.get(k)[i][j]);
values_Wind.setFloat(index_Wind.set(n,k,i,j), Wind.get(k)[i][j]);
values_Wind_speed.setFloat(index_Wind_speed.set(n,k,i,j), Wind_speed.get(k)[i][j]);
values_u_component_of_wind_height.setFloat(index_u_component_of_wind_height.set(n,k,i,j), u_component_of_wind_height.get(k)[i][j]);
values_u_component_of_wind_gust.setFloat(index_u_component_of_wind_gust.set(n,k,i,j), u_component_of_wind_gust.get(k)[i][j]);
values_v_component_of_wind.setFloat(index_v_component_of_wind.set(n,k,i,j), v_component_of_wind.get(k)[i][j]);
values_v_component_of_wind_gust.setFloat(index_v_component_of_wind_gust.set(n,k,i,j), v_component_of_wind_gust.get(k)[i][j]);
}
}
}
}
for (int k = 0; k < 1; k++) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
//将二维数组[i][j]处的数据写入网格的i,j处
values_Pressure.setFloat(index_Pressure.set(k,i,j), Pressure.get(k)[i][j]);
values_Total_precipitation.setFloat(index_Total_precipitation.set(k,i,j), Total_precipitation.get(k)[i][j]); }
}
}
fileWriter.write(vx, xvalues);
fileWriter.write(vy, yvalues);
fileWriter.write(vtime, timevalues);
fileWriter.write(vgrounp, grounpvalues);
fileWriter.write(vgrounp1, grounp1values);
fileWriter.write(v_dims_Dewpoint_temperature, values_Dewpoint_temperature);
fileWriter.write(v_dims_Pressure, values_Pressure);
fileWriter.write(v_dims_Relative, values_Relative);
fileWriter.write(v_dims_Temperature, values_Temperature);
fileWriter.write(v_dims_Total_precipitation, values_Total_precipitation);
fileWriter.write(v_dims_Wind,values_Wind);
fileWriter.write(v_dims_Wind_speed, values_Wind_speed);
fileWriter.write(v_dims_u_component_of_wind_height, values_u_component_of_wind_height);
fileWriter.write(v_dims_u_component_of_wind_gust, values_u_component_of_wind_gust);
fileWriter.write(v_dims_v_component_of_wind, values_v_component_of_wind);
fileWriter.write(v_dims_v_component_of_wind_gust, values_v_component_of_wind_gust);
fileWriter.close();
System.out.println("文件已存入"+filepath1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件创建失败,请检查路径");
} catch (InvalidRangeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件写入错误,超出范围");
}
}