學氣象的少不了使用netcdf文件,這文件是干嘛的我就不多提了,網上多得是。 網上用java讀取netcdf文件的帖子多如牛毛,我今天要做的就是如何使用java來寫入nc文件 廢話不多少,先上干活。 首先你得引入一個包。我這里是引入了
netcdfAll-4.6.6.jar以下為具體代碼
package com.cym.utils;import java.io.IOException;import java.util.ArrayList;import ucar.ma2.ArrayFloat;import ucar.ma2.DataType;import ucar.ma2.Index;import ucar.ma2.InvalidRangeException;import ucar.nc2.Attribute;import ucar.nc2.Dimension;import ucar.nc2.NetcdfFileWriter;import ucar.nc2.Variable;import ucar.nc2.NetcdfFileWriter.Version;public class NCfile { public static int width=20,height=16; public static double lonWest=110,latSouth=30; public static double gridInterval=0.5; /** * * @param filepath 創建的文件路徑 * @param width 網格橫向長度 * @param height 網格縱向高度 * @param lonWest 網格左下角起始經度 * @param latSouth 網格左下角起始維度 * @param gridInterval 網格間距 * @param d d[i][j]為網格i和j處對應的數據 * @throws IOException * @throws InvalidRangeException */ public static void createNCfile(String filepath,int width,int height,double lonWest,double latSouth,double gridInterval,double d[][]){ //創建netcdf3寫入文件對象 NetcdfFileWriter fileWriter; try { fileWriter = NetcdfFileWriter.createNew(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.運行后,控制臺會打印
使用Panoply來打開看看該文件
可以看到有三個變量,分別為lon,lat,var,其中Type分別為1D,1D,Geo2D,如果你沒有在代碼中加入如下代碼,則就是普通的2D坐標,不是地理2D坐標,當時我用沒有加單位的文件用ncl作圖就會出現問題
這里都是我剛寫入的數據,數據都是瞎編的,實際工作中按照需求你們自己去修改吧,這是瞎編的數據
d[i][j]=Math.sin(i+j);使用panoply查看數據 

新聞熱點
疑難解答