//固定nc文件
public static final String filepath="E://output//testNCfiles9999gs.nc";
@PostMapping("/createNCfile")
public static void createNCfile(@RequestParam(value = "width",required = true) Integer width,
@RequestParam(value = "height",required = true) Integer height,
@RequestParam(value = "lonWest",required = true) double lonWest,
@RequestParam(value = "latSouth",required = true) double latSouth,
@RequestParam(value = "gridInterval",required = true) double gridInterval
){
//創建netcdf3寫入文件對象
NetcdfFileWriter fileWriter;
double d[][]=new double[width][height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
d[i][j]=Math.sin(i+j);
}
}
try {
fileWriter = NetcdfFileWriter.createNew(NetcdfFileWriter.Version.netcdf3, filepath);
//分別創建經度和緯度方向的維度,lon的寬度爲width,lat高度爲height,並命名爲lon和lat
Dimension xdim=fileWriter.addDimension(null, "lon", width);
Dimension ydim=fileWriter.addDimension(null, "lat", height);
//通過一維組合成二維array list
ArrayList<Dimension> dims=new ArrayList<Dimension>();
//注意這裏add的順序很重要,一定要和數據對應,如果把list順序調換,
// 那麼二維的維度也會不同,相當於數學中的座標系,
// 第一個是x座標,第二個是y座標,x寬度爲width,y高度爲height
dims.add(xdim);
dims.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" ));
//創建變量名稱爲var的變量,對應的維度爲dims,該dims爲上面定義的一個ArrayList<Diminsion>,該list包含2個維度,經度和維度
Variable v=fileWriter.addVariable(null, "var", DataType.FLOAT, dims);
fileWriter.addVariableAttribute(v, new Attribute("long_name","數據的詳細描述" ));
fileWriter.addVariableAttribute(v, new Attribute("units","unit" ));
//使用create()來創建該文件,只有create之後才能在文件夾中顯示該文件,並且寫入數據
fileWriter.create();
//創建x和y方向上的變量。D1 代表一維
ArrayFloat xvalues=new ArrayFloat.D1(width);
ArrayFloat yvalues=new ArrayFloat.D1(height);
//創建網格上的變量,D2代表二維,用(width, height)來描述他的定義域,
// 這個順序必須和ArrayList<Dimension> 加載的順序一一對應,否則會出錯
ArrayFloat values=new ArrayFloat.D2(width, height);
Index index=values.getIndex();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
//將二維數組[i][j]處的數據寫入網格的i,j處
values.setDouble(index.set(i, j), d[i][j]);
}
}
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));
}
fileWriter.write(vx, xvalues);
fileWriter.write(vy, yvalues);
fileWriter.write(v, values);
//關流
fileWriter.close();
System.out.println("文件已存入"+filepath);
}catch (IOException e) {
e.printStackTrace();
System.out.println("文件創建失敗,請檢查路徑");
} catch (InvalidRangeException e) {
e.printStackTrace();
System.out.println("文件寫入錯誤,超出範圍");
}
}
使用java創建netcdf文件,並寫入數據的接口
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.