国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

使用java創建netcdf文件,并寫入數據

2019-11-06 08:39:06
字體:
來源:轉載
供稿:網友

學氣象的少不了使用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作圖就會出現問題

fileWriter.addVariableAttribute(vx, new Attribute("units","Degrees_east" ));fileWriter.addVariableAttribute(vy, new Attribute("units","Degrees_north"));

這里都是我剛寫入的數據,數據都是瞎編的,實際工作中按照需求你們自己去修改吧,這是瞎編的數據

d[i][j]=Math.sin(i+j);

使用panoply查看數據 這里寫圖片描述

這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文登市| 吉木乃县| 哈尔滨市| 延吉市| 新巴尔虎右旗| 普洱| 平武县| 普定县| 静安区| 丰城市| 攀枝花市| 桦甸市| 交口县| 会理县| 贺州市| 南充市| 漯河市| 绥棱县| 德钦县| 天门市| 沁水县| 日土县| 衡水市| 辽宁省| 邵东县| 水城县| 景宁| 师宗县| 灵山县| 松滋市| 望江县| 三台县| 澜沧| 平阳县| 天台县| 台南县| 肇东市| 湾仔区| 锡林浩特市| 定安县| 滨海县|