NetCDF文件写入
/**
* 维度Dimension:域、范围 lon = 20即(lon∈[0,20])
* 变量Variable:函数 float lon(lon=20) 即 float y = f(lon) lon∈[0,20]
* 属性:变量对应的元数据映射
*/
public class NCFile {
private static Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public static int width=20,height=16;
public static double lonWest=110,latSouth=30;
public static double gridInterval = 0.5;
private static void createNCFile(String outPath, int width, int height, double lonWest, double latSouth, double gridInterval, double[][] data) {
try {
NetcdfFileWriteable writeable = NetcdfFileWriteable.createNew(outPath);
//创建经度和纬度方向的纬度
Dimension xdim = writeable.addDimension("lon",width);
Dimension ydim = writeable.addDimension("lat",height);
//合成二维Array
List<Dimension> dims = new ArrayList<>();
//顺序必须固定,对应后面数据顺序
dims.add(xdim);
dims.add(ydim);
//变量
Variable vx = writeable.addVariable("lon", DataType.FLOAT,"lon");
//数据说明,long_time 绘图时坐标说明
writeable.addVariableAttribute(vx,new Attribute("long_name","longitude"));
//单位 东经
writeable.addVariableAttribute(vx,new Attribute("units","Degrees_east"));
Variable vy = writeable.addVariable("lat", DataType.FLOAT,"lat");
writeable.addVariableAttribute(vy,new Attribute("long_name","latitude"));
writeable.addVariableAttribute(vy,new Attribute("units","Degrees_north"));
//创建变量var 纬度为dims
Variable var = writeable.addVariable("var",DataType.FLOAT,dims);
writeable.addVariableAttribute(var,new Attribute("long_name","数据详细描述"));
writeable.addVariableAttribute(var,new Attribute("units","unit"));
writeable.create();
//D1代表一维
ArrayFloat xValues = new ArrayFloat.D1(width);
ArrayFloat yValues = new ArrayFloat.D1(height);
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));
}
//D2代表二维
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处
index.set(i,j);
values.setDouble(index,data[i][j]);
}
}
writeable.write(vx.getName(),xValues);
writeable.write(vy.getName(),yValues);
writeable.write(var.getName(),values);
writeable.close();
System.out.println("写入完成");
} catch (Exception e) {
logger.warn(e.getMessage(),e);
}
}
public static void main(String[] args) {
double[][] data = new double[width][height];
for (int i=0;i<width;i++){
for (int j=0;j<height;j++){
data[i][j] = Math.sin(i+j);
System.out.println(i+"--"+j+"--"+data[i][j]);
}
}
String outPath = "C:\\Users\\Administrator\\Desktop\\out.nc";
NCFile.createNCFile(outPath,width,height,lonWest,latSouth,gridInterval,data);
}
}