netcdf3实现三四维数组数据中多个要素写入生成nc文件

需要一个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("文件写入错误,超出范围");
        }

    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值