java读取NetCDF数据

最近用到了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文件

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值