最近用到了nc格式的数据,就像详细了解了。
NetCDF全称为network Common Data Format,
一个netcdf文件的结构包括以下对象:
1、变量(Variables)
变量对应着真实的物理数据。比如说温度。
2、维(dimension)
一个维对应着函数中的某个自变量,或者说函数图象中的一个坐标轴,在线性代数中就是一个N维向量的一个分量(这也是维这个名称的由来)。在netcdf中,一个维具有一个名字和范围(或者说长度,也就是数学上所说的定义域,可以是离散的点集合或者连续的区间)
3、属性(Attribute)
属性对变量值和维的具体物理含义的注释或者说解释。因为变量和维在netcdf中都只是无量纲的数字,要想让人们明白这些数字的具体含义,就得靠属性这个对象了。
在netcdf中,属性由一个属性名和一个属性值(一般为字符串)组成。比如,在某个cdl文件(cdl文件的具体格式在下一节中讲述)中有这样的代码段
temperature:units = “celsius” ;
前面的temperature是一个已经定义好的变量(Variable),即温度,冒号后面的units就是属性名,表示物理单位,=后面的就是units这个属性的值,为“celsius” ,即摄氏度,整个一行代码的意思就是温度这个物理量的单位为celsius,很好理解。
1、需要依赖
<!-- https://mvnrepository.com/artifact/edu.ucar/netcdf4 -->
<dependency>
<groupId>edu.ucar</groupId>
<artifactId>netcdf4</artifactId>
<version>4.5.5</version>
</dependency>
2、读取nc文件样例
/**
* 从全球nc数据中裁剪指定区域的数据
*
* @param resourPath nc文件所在位置路径
* @param startLon 指定区域开始的经度
* @param startLat 指定区域开始的纬度
* @param latCount 纬度要读取多少个点
* @param lonCount 经度要读取多少个点
* @param begin 从时间纬度的第几层开始读取
* @param end 第几层结束
* @return 指定区域的数据
*/
public static short[][] readNCfile(String resourPath, int latCount, int lonCount, float startLon, float startLat,int begin,
int end) {
try {
NetcdfFile ncFile = NetcdfFile.open(resourPath); //获取源文件
Variable v = ncFile.findVariable("qpf_ml"); //读取qpf_ml的变量,
//
short[][] values = null;
for (int i = begin; i < end; i++) { //本读取的qpf_ml是一个3维数据,时间、经度、维度,一下子把3维数据全部读出来会很大,时间维度是24层,所以通过遍历时间维度获取数据,i为时间维度的层数
int[] origin = { i, (int) ((latNorth - startLat) * 100), (int) ((startLon - lonEast) * 100) };//origin 设置维度准备从哪个位置开始读取数据
int[] shape = { 1, latCount, lonCount };//shape 和origin对应,设置读取多少点后结束
short[][] temp = (short[][]) v.read(origin, shape).reduce(0).copyToNDJavaArray(); //去掉时间维度,变为二维
if (values != null) {
for (int j = 0; j < latCount; j++) {
for (int k = 0; k < lonCount; k++) {
values[j][k] += temp[j][k];
}
}
}else {
values = temp;
}
}
ncFile.close();
return values;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidRangeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
至此,读文件结束,下篇会写如何生成nc文件