常用气象数据Netcdf,GRIB,HDF,CSV,GeoTIFF,BUFR数据介绍与解析为json

NetCDF

NetCDF(Network Common Data Form):一种自描述、自包含的数据格式,广泛用于存储气象和气候模型输出、观测数据等。NetCDF支持多维度数组、属性和变量,便于跨平台共享。

 java实现

主要利用netCDF-Java 5.6.0 实现。


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.jupiter.api.Test;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;

import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReadNcTest {

    @Test
    void readNcToJson() throws Exception {
        //获取 nc 文件的路径
        String url = "325china.nc";

        //转成 json 后存放的目录
        //注意:无论 windows 还是 linux 下的路径,都统一使用 / 进行分割
        String destDir = "d:/";
        //使用 PanoplyWin 工具,打开 nc 文件,可以看到里面有 3 个变量
        List<String> datalist = new ArrayList<>(Arrays.asList("lon", "lat", "water_u"));
        //针对 3 个变量的数据,分别生成 json 文件
        exportJson(url, destDir, datalist);
    }

    private void exportJson(String ncFileFullPath, String destDir, List<String> dataItem) {

        // 打开 NetCDF 文件
        try (NetcdfFile ncFile = NetcdfFile.open(ncFileFullPath)) {
            //遍历nc文件中的每个变量,输出json数据
            for (String it : dataItem) {
                // 读取其中的变量
                Variable var = ncFile.findVariable(it);

                // 获取变量的维度
                int[] shape = var.getShape();
                int[] origin = new int[shape.length];

                // 读取变量的值
                Object data = var.read(origin, shape).get1DJavaArray(var.getDataType().getPrimitiveClassType());

                // 使用 Gson 将数据转换为 JSON 格式
//                Gson gson = new Gson();
                Gson gson = new GsonBuilder()
                        .serializeSpecialFloatingPointValues() // 允许序列化NaN和Infinity
                        .create();
                String json = gson.toJson(data);


                // 输出 JSON 数据到控制台
//                System.out.println(json);

                String jsonfile = "aaa.json";

                // 将 JSON 数据写入到文件
                try (FileWriter writer = new FileWriter(jsonfile)) {
                    writer.write(json);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

GRIB

GRIB(GRIdded Binary):主要用于气象预报产品,包括GRIB1和GRIB2两种版本。它以高效的方式存储大量的气象格点数据,如温度、风速等,是气象预报中心之间交换数据的标准格式。

需求:转json给webgis使用。

读取:wgrib2,Panoply等工具读取可视化。

工具:可以用为grib2json,这是java写的,开源的可以直接集成到自己程序里。也可以打包使用。

1.grib2json使用


1.1数据下载

https://nomads.ncep.noaa.gov/

点击对应数据下载。

1.2工具下载
gitgub

1.2.打包
此实用程序使用 netCDF-Java GRIB 解码器,它是 THREDDS 项目的一部分 由大学大气研究公司/Unidata 提供。说明是java源代码。需要自己打包。

 在目录里运行打包命令,打成jar包。

mvn package
mvn没有需下载maven工具。

1.3运行
把打包文件解压,进入grib2json-master\target\grib2json-0.8.0-SNAPSHOT\grib2json-0.8.0-SNAPSHOT\bin文件夹里运行。也可以设置全局变量,这样就不需要进入此文件夹运行了。

grib2json --help
Usage: grib2json [options] FILE
    [--compact -c] : enable compact Json formatting
    [--data -d] : print GRIB record data
    [--filter.category --fc value] : select records with this numeric category
    [--filter.parameter --fp value] : select records with this numeric parameter
    [--filter.surface --fs value] : select records with this numeric surface type
    [--filter.value --fv value] : select records with this numeric surface value
    [--help -h] : display this help
    [--names -n] : print names of numeric codes
    [--output -o value] : write output to the specified file (default is stdout)
    [--verbose -v] : enable logging to stdout
 
1.4转换
命令行输入正确文件路径。

grib2json -d -n -o test.json D:/ex.grib2
或直接用java运行jar包

java -jar grib2json-0.8.0-SNAPSHOT.jar -d -n -o test.json D:/ex.grib2

2.java代码实现

本工具依赖netCDF-Java, 源码里有实现可以抽离出使用。

其他数据介绍与解析

数据

1. HDF(Hierarchical Data Format):类似于NetCDF,支持复杂的数据结构,适用于大规模科学数据集的存储和分发。HDF4和HDF5是两个主要版本。

2. CSV(Comma-Separated Values):简单的文本格式,易于阅读和处理,常用于数据交换,但缺乏自描述性,不包含元数据。

3. GeoTIFF:一种地理空间图像格式,用于存储栅格数据,如卫星图像或气象地图,包含地理坐标信息。

4. BUFR(Binary Universal Form for the Representation of Meteorological Data):国际气象组织推荐的一种二进制编码格式,特别适用于气象观测数据的交换。

读取软件工具:
  • Panoply:NASA开发的免费软件,可以打开、查看和转换NetCDF、HDF、GRIB等格式数据。
  • HDFView:打开HDF4 HDF5
  • NCAR Command Language (NCL):提供丰富的脚本语言功能,用于处理NetCDF、GRIB等气象数据。
  • GDAL/OGR:一个开源地理空间处理库,提供了广泛的格式转换能力,支持gis领域数据与气象数据得格式转换能力,支持NetCDF、HDF、GeoTIFF等格式的转换。
编程语言库
  • Python: 利用netCDF4, pygrib, h5py等库进行数据读写和格式转换。xarray库提供了更高级的数据结构,方便处理NetCDF和GRIB数据。
  • java:netCDF-Java ,netcdfAll-4.6.11.jar是一个强大的Java库,专门用于处理NetCDF格式的数据,同时也支持标准的GRIB1和GRIB2格式数据的解码。jHDF:纯Java实现的HDF5库使用。HDF5等.
  • js

04-03
### GRIB 文件格式简介 GRIB 是一种用于存储和传输气象数据的标准二进制文件格式,广泛应用于全球范围内的天气预报和气候研究领域。它由世界气象组织 (WMO) 制定并维护,目前存在两个主要版本:GRIB1 和 GRIB2[^1]。 - **GRIB1**: 较旧的版本,功能有限,主要用于早期的应用场景。 - **GRIB2**: 更现代的版本,支持更丰富的元数据描述能力以及更高的灵活性,适用于复杂的气象数据分析需求。 ### Python 中处理 GRIB 文件的方法 #### 使用 Pygrib 进行基本操作 `pygrib` 是一个专门设计用来读取和写入 GRIB 数据的 Python 接口工具库。以下是其典型应用: ```python import pygrib # 加载 GRIB 文件 grbs = pygrib.open('example.grib') # 遍历所有的记录 for grb in grbs: print(grb) # 输出每条记录的信息 ``` 上述代码展示了如何加载一个 GRIB 文件,并逐条打印其中的数据记录信息。 #### 将 GRIB 转换为 CSV 格式 对于某些应用场景来说,可能需要将 GRIB 数据导出到更加通用的形式如 CSV 文件以便进一步分析或者其他软件集成。下面是一个完整的例子展示这一过程: ```python import cfgrib import pandas as pd # 使用cfgrib打开GRIB文件 ds = cfgrib.open_dataset('data.grib') df = ds.to_dataframe().reset_index() # 可选的时间列转换 if 'time' in df.columns and not isinstance(df.iloc[0]['time'], pd.Timestamp): df['time'] = pd.to_datetime(df['time']) # 导出至CSV df.to_csv('output.csv', index=False) ``` 这段脚本利用 `cfgrib` 来解析原始 GRIB 文件中的多维数组结构,并将其转化为 Pandas DataFrame 形式的表格型数据集之后保存下来成为标准逗号分隔符形式文档[^2]。 ### 注意事项 当执行这些任务时需要注意几个方面: - 确认安装了必要的依赖项 (`pip install pygrib cfgrib`); - 正确指定输入/输出路径名; - 某些字段可能会因为编码差异而引起错误,在这种情况下可以尝试调整参数设置来解决兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值