网络通用数据格式NetCDF

NetCDF是一种面向数组的科学数据格式,由UCAR的Unidata项目开发,广泛应用于大气科学等领域。它包含维(dimension)、变量(Variables)和属性(Attributes),支持多种数据类型,并允许无限长度的维。编程解析NetCDF文件需要相关库,如NetCDF-Java API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本含义

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 水平

相关文档

ArrayStructures | netCDF-Java Documentationhttps://docs.unidata.ucar.edu/netcdf-java/current/userguide/arraystructures_ref.html

NetCDF-Java CDM Public API v5.5.3-SNAPSHOThttps://docs.unidata.ucar.edu/netcdf-java/5.5/javadoc/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值