基本含义
NetCDF
网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作 NetCDF 数据集。
对程序员来说,它和zip、jpeg、bmp文件格式类似,都是一种文件格式的标准。netcdf文件开始的目的是用于存储气象科学中的数据,已经成为许多数据采集软件的生成文件的格式。
从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,...)=value,函数的自变量x,y,z等在netcdf中叫做维(dimension)或坐标轴(axis),函数值value在netcdf中叫做变量(Variables).而自变量和函数值在物理学上的一些性质,比如计量单位(量纲)、物理学名称等等在netcdf中就叫属性(Attributes)。
-
自变量x,y,z : dimension
-
函数值value : Variables
-
计量单位(量纲)、物理学名称 : Attributes
-
Data : 数据
变量(Variables)
netcdf中的变量就是一个N维数组,数组的维数就是实际问题中的自变量个数,数组的值就是观测得到的物理值。
变量(数组值)在netcdf中的存储类型有六种:
-
ascii字符(char),
-
字节(byte),
-
短整型(short),
-
整型(int),
-
浮点(float),
-
双精度(double)。
维(dimension)
一个维对应着函数中的某个自变量,或者说函数图象中的一个坐标轴,在线性代数中就是一个N维向量的一个分量(这也是维这个名称的由来)
在netcdf中,维的长度基本都是有限的,最多只能有一个具有无限长度的维。
属性(Attribute)
属性对变量值和维的具体物理含义的注释或者说解释.
编程解析netcdf文件
依赖
<!--netcdf4 依赖-->
<dependency>
<groupId>edu.ucar</groupId>
<artifactId>netcdf4</artifactId>
<version>4.5.5</version>
</dependency>
源码
package com.chenqing.test; //自己创建的包
//需要导入依赖
import com.cqkj.data.pojo.GridDataInfo; //公司的依赖
import com.cqkj.data.util.MetDataUtil; //公司的依赖
import ucar.ma2.Array;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.Dimension;
import ucar.nc2.NCdumpW;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class read {
public static void main(String[] args) throws IOException, InvalidRangeException {
NetcdfFile ncFile = NetcdfFile.open("C:\\Users\\12917\\Desktop\\工作\\nc\\test1.nc"); //获取源文件
// List<Dimension> dimensions = ncFile.getDimensions();
// System.out.println("Dimensions:" + dimensions);
// List<Variable> variables = ncFile.getVariables();
// System.out.println("Variables:" + variables);
// System.out.println("Variables:" + variables.size());
// String detailInfo = ncFile.getDetailInfo();
// // Object o = variable.read().copyTo1DJavaArray();
// System.out.println("detailInfo:" + detailInfo);
// 获取文件位置
// String location = ncFile.getLocation();
// System.out.println("location:" + location);
// Variable variable = ncFile.findVariable("CR");
// Variable variable = ncFile.findVariable("C:\\Users\\12917\\Desktop\\工作\\nc\\test.nc");
// GridDataInfo gridDataInfo = MetDataUtil.readNC(variable.getNameAndDimensions());
// 单维NC解析
GridDataInfo gridDataInfo = MetDataUtil.readNC("C:\\Users\\12917\\Desktop\\工作\\nc\\test1.nc");
// GridDataInfo gridDataInfo = MetDataUtil.readNC("C:\\Users\\12917\\Desktop\\工作\\nc\\test.nc", "width");
// System.out.println("gridDataInfo:" + gridDataInfo);
// System.out.println(gridDataInfo instanceof Object);
// int l = gridDataInfo.getData().length;
int j=0;
double[] abc = gridDataInfo.getData();
for (double a:abc) {
if (a == 0.0){
j++;
}else {
System.out.println(a);
}
}
System.out.println(j);
Double value1 = gridDataInfo.interpolation(110.0, 30.0);
Double value2 = gridDataInfo.interpolation(130.0, 50.0);
Double value3 = gridDataInfo.interpolation(150.0, 70.0);
System.out.println("value1:" + value1);
System.out.println("value2:" + value2);
System.out.println("value3:" + value3);
// Variable data = ncFile.findVariable("data");
// Variable cr = ncFile.findVariable("CR");
// Variable time = ncFile.findVariable("time");
// Variable lat = ncFile.findVariable("lat");
// Variable lon = ncFile.findVariable("lon");
// Variable level = ncFile.findVariable("level");
//
// // System.out.println("data:" + data);
// System.out.println("cr:" + cr);
// System.out.println("time:" + time);
// System.out.println("lat:" + lat);
// System.out.println("lon:" + lon);
// System.out.println("level:" + level);
// System.out.println("cr:" + cr);
// GridDataInfo 转为PNG图片
// gridDataInfo.toPngDataInfo().toImage("C:\\\\Users\\\\12917\\\\Desktop\\\\工作\\\\nc\\\\" + (int)(Math.random()*100)+1 + "test.png");
// System.out.println("图片输出成功");
// Object cr = ncFile.findVariable("CR").read().copyTo1DJavaArray();
// List<InfoDataDetail> infoDataDetails = MetDataUtil.read3DData("C:\\\\Users\\\\12917\\\\Desktop\\\\工作\\\\nc\\\\test.nc", "CR");
// System.out.println("infoDataDetails:" + infoDataDetails);
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHH0000");//设置日期格式
String data_format = df.format(new Date());
System.out.println(data_format);
// 关闭文件
ncFile.close();
}
}
缩写
-
lon 经度
-
lat 纬度
-
CR 组合反射率
-
time 时间
-
data 日期
-
level 水平