JAVA解析气象文件(GRIB、NC)并以JSON格式输出

告别数据孤岛:用Spring Boot + FastJSON将气象NC/grb2文件一键转成GeoJSON矢量地图 本文详细介绍了如何利用Spring Boot和FastJSON将气象NC/grb2文件高效转换为GeoJSON矢量地图,解决数据解析、坐标转换和矢量生成等核心挑战。通过分层架构设计和性能优化策略,显著提升转换效率,适用于现代WebGIS系统集成。 阅读详情
AI摘要

该博客介绍用Java解析气象文件并以JSON格式输出。先介绍netcdfAll技术优势与NetCDF库重点结构,包括文件对象、维度、变量、属性等类。接着讲解气象文件(.NC、.GRB)内容,最后阐述读取气象文件、全局变量、文件维度、变量属性及内容数据的主要方法,并给出代码示例。

netcdfAll介绍

1. 技术优势

1)标准化支持:NetCDF库支持标准的GRIB、NC格式数据,确保你能够处理大多数常见的气象文件数据。
2)易于集成:通过简单的步骤,你可以将netcdfAll-4.6.11.jar包集成到你的Java项目中,快速开始解码工作。

2. NetCDF库重点结构

  1. NetcdfFile(文件对象)类
    文件主类
  2. Dimensions(维度)类
    定义数据的维度,如时间、纬度、经度等。
  3. Variables(变量)类
    存储实际数据,每个变量可以有一个或多个维度。
  4. Attributes(属性)类
    存储元数据,如单位、描述等,可以附加到文件、变量或维度上。
  5. Global Attributes(全局属性)
    描述整个文件的元数据。

3. 认识气象文件内容

注意!注意!注意!
气象文件中的data中,全是9组成的一般代表缺省值

.NC文件

文件格式·:

4.	netcdf C:\XXX.nc {
5.	  dimensions:
6.	    Time = 1;
7.	    DateStrLen = 19;
8.	    south_north = 70;
9.	    west_east = 63;
10.	    bottom_top = 5;
11.	  variables:
12.	    char XTIME(Time=1, DateStrLen=19);
13.	
14.	    //经度
15.	    float XLONG(Time=1, south_north=70, west_east=63);
16.	      :coordinates = "XLONG XLAT";
17.	      :stagger = "";
18.	      :units = "degree_east";
19.	      :description = "LONGITUDE, WEST IS NEGATIVE";
20.	      :MemoryOrder = "XY ";
21.	      :FieldType = 104; // int
22.	
23.	    //维度
24.	    float XLAT(Time=1, south_north=70, west_east=63);
25.	      :coordinates = "XLONG XLAT";
26.	      :stagger = "";
27.	      :units = "degree_north";
28.	      :description = "LATITUDE, SOUTH IS NEGATIVE";
29.	      :MemoryOrder = "XY ";
30.	      :FieldType = 104; // int
...

数据内容

31.	24.753906 24.750221 24.746468 24.742615 24.738678 24.734657 24.730568 24.726387 24.7221 24.717743 24.71331 24.708786 24.70417 24.699478 24.694687 24.689827 24.684868 24.679832 24.674713 24.66951 24.664207 24.658836 24.653381 24.647835 24.642204 24.636482 24.630692 24.624794 24.618835 24.61277 24.606628 24.60041 24.594109 24.587723 24.581238 24.574677 24.568031 24.56131 24.55449 24.547592 24.540611 24.533554 24.526382 24.519165 24.51184 24.504433 24.496956 24.489388 24.481712 24.473984
32.	...

.GRB文件

文件结构

41.	netcdf C:\XXXX.GRB2 {
42.	  dimensions:
43.	    lon = 116;
44.	    lat = 116;
45.	    time = 80;
46.	  variables:
47.	    int LatLon_Projection;
48.	      :grid_mapping_name = "latitude_longitude";
49.	      :earth_radius = 6371229.0; // double
50.	
51.	    float lat(lat=116);
52.	      :units = "degrees_north";
53.	
54.	    float lon(lon=116);
55.	      :units = "degrees_east";
56.	
57.	    double reftime;
58.	      :units = "Hour since 2025-01-01T20:00:00Z";
59.	      :standard_name = "forecast_reference_time";
60.	      :long_name = "GRIB reference time";
61.	      :calendar = "proleptic_gregorian";
62.	...
63.	// global attributes:
71.	  :Originating_or_generating_Center = "Beijing (RSMC)";
72.	  :Originating_or_generating_Subcenter = "0";
73.	  :GRIB_table_version = "1,0";
74.	  :Type_of_generating_process = "Forecast";
75.	  :file_format = "GRIB-2";
76.	  :Conventions = "CF-1.6";
77.	  :history = "Read using CDM IOSP GribCollection v3";
78.	  :featureType = "GRID";


数据内容

79.	108.65 108.700005 108.75 108.8 108.85 108.9 108.950005 109.0 109.05 109.1 109.15 109.200005 109.25 109.3 109.35 109.4 109.450005 109.5 109.55 109.6 109.65 109.700005 109.75 109.8 109.85 109.9 109.950005 110.0 110.05 110.1 110.15 110.200005 110.25 110.3 110.35 110.4 110.450005 110.5 110.55 110.6 110.65 110.700005 110.75 110.8 110.85 110.9 110.950005 111.0 111.05...

80. 主要方法

1)读取气象文件(NC、GRB2)

81.	NetcdfFile.open(filePath);

2)读取全局变量

82.	ncFile.getGlobalAttributes()

3)获取文件维度

83.	variable.getDimensions()

4)获取变量属性

84.	variable.getAttributes()

5)读取内容数据

85.	variable.read()

代码示例

//        String filePath = "PATH\\Z_SEVP_C_BABJ_XXX_P_CMA-xxx.nc"; // NetCDF 文件路径
        String filePath = "PATH\\Z_NWGD_C_BECS_XXX_P_XXX_XXX.GRB2";
        NetcdfFile ncFile = null;
        //全局变量
        JSONObject globalJson = new JSONObject();
        AnyVo anyVo = new AnyVo();
        //结果集
        JSONObject resultJson = new JSONObject();

        try {
            //读取文件
            ncFile = NetcdfFile.open(filePath);
            //检查全局变量并提取
            if (!ncFile.getGlobalAttributes().isEmpty()) {
                for (Attribute globalAttribute : ncFile.getGlobalAttributes()) {
                    globalJson.put(globalAttribute.getName(), globalAttribute.getStringValue());
                }
            }
            //存入结果集
            resultJson.put("globallAttribute", globalJson);
            JSONObject valueObject = new JSONObject();
            //检查属性变量并提取
            if (!ncFile.getVariables().isEmpty()) {
                String name = null;
                for (Variable variable : ncFile.getVariables()) {
                    JSONObject attrJson = new JSONObject();
                    name = variable.getShortName();
                    attrJson.put("name", name);
                    //循环遍历维度
                    if (!variable.getDimensions().isEmpty()) {
                        for (Dimension dimension : variable.getDimensions()) {
                            if (dimension.getShortName()==null) {
                                continue;
                            }
                            attrJson.put(dimension.getName(), dimension.getLength());
                        }
                    }
                    //提取变量属性
                    if (!variable.getAttributes().isEmpty()){
                        variable.getAttributes().forEach(attr -> {
                            //确认单个变量唯一项,需以唯一项为key其他值为value进行存储,方便后续提供或者处理,需要自行调整
//                        JSONObject singleAttr = new JSONObject();
                            //变量属性
                            attrJson.put(attr.getName(),attr.getStringValue());
                        });
                    }
                    valueObject.put(name,attrJson);
//                    jsonArray.put(attrJson);
                    Array data = variable.read();
                    // 打印数据
                    int[] shape = data.getShape();
                    Index index = data.getIndex();
                    List<Double> list = new ArrayList();
                    //三维数组
                    if (shape.length==3) {
                        for (int i = 0; i < (shape[0]>4?2:shape[0]); i++) {
                            for (int j = 0; j < (shape[1]>4?2:shape[0]); j++) {
                                for (int k = 0; k < (shape[2]>4?2:shape[0]); k++) {
                                    list.add(data.getDouble(index.set(i, j, k)));
                                }
                            }
                        }
                        //四维数组
                    }else if (shape.length==4) {
                        for (int i = 0; i < (shape[0]>4?2:shape[0]); i++) {
                            for (int j = 0; j < (shape[1]>4?2:shape[0]); j++) {
                                for (int k = 0; k < (shape[2]>4?2:shape[0]); k++) {
                                    for (int l = 0; l < (shape[3]>4?2:shape[0]); l++) {
                                        list.add(data.getDouble(index.set(i, j, k,l)));
                                    }
                                }
                            }
                        }
                    }
                    attrJson.put("data",list);

                }
            }

            resultJson.put("attr",valueObject);
            System.out.println(resultJson);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (ncFile != null) {
                    ncFile.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
Java生成NetCDF文件 阅读详情

相关推荐

从NC、GRIB2到WebGIS:气象数据解析、CMIS/MICPS转换与前端可视化实战

本文系统介绍了如何将NC、GRIB2等原始气象数据,通过解析、转换(如生成GeoJSON、CMIS/MICPS格式)等核心步骤,最终在WebGIS前端实现高效、动态的可视化。文章重点分享了从数据解码到前端地图集成的完整实战路径,并针对CMIS/MICPS等标准格式转换提供了具体方案,旨在帮助开发者打通气象数据可视化的全链路。

weixin_29063979的博客 262

Java读取netcdf文件和生成等值线的jar_netcdf_wContour

Java读取netcdf文件和生成等值线所用的jar

JAVA以SHP文件,切割一个数据集(GRB2、NC)中边界内的范围或数据

注:由于本次代码以grb2文件举例,若是需要了解nc文件,请看上次的文章《JAVA解析气象文件(GRIB、NC)并以JSON格式输出》链接: link 部分内容解释 Polygon对象 以上图的代码为例,当SHP文件中存在飞地时,如String iId = String.valueOf(feature.getAttribute(5));这行获取的是省区域编码,并且该省出现飞地,那么System.out.println(“--------------”+iId);就会存在该省份的区域编码打印多次的情况,

疯人愿 350

解析nc格式文件,GRB格式文件的依赖包edu.ucar.netcdfAll的api 学习

nc文件解析

一天不写代码难受的博客 3937

别再为气象图发愁了!手把手教你用Java + wContour + GeoTools搞定等值面分析与出图

本文详细介绍了如何使用Java结合wContour和GeoTools构建气象可视化系统,实现等值面分析与专业地图渲染。从数据预处理、空间插值优化到地理空间处理和高性能渲染,提供全链路解决方案,帮助开发者快速应对气象数据可视化需求。

weixin_30606461的博客 473

grib2json:从GRIB到JSON的气象数据转换实战指南

气象领域的数据交换常遇到GRIB这类高效二进制格式,它在存储多维网格场时压缩率高、信息完整,但面对现代Web可视化、消息队列或前端直接读取场景时,二进制编码却成了数据消费的障碍。理解GRIB文件内部Section布局(如网格定义、产品定义、数据表示)是解包的基础,而通过Java生态的NetCDF-Java库或eccodes桥接,可将位串解压为结构化JSON。这种转换让气象分析师、后端管道开发者和可视化工程师能直接使用标准JSON格式进行数据处理。典型应用包括:将GRIB场转为JSON后,用Python脚本快

weixin_29053383的博客 311

气象数据NC、grb2解析成矢量json、CMIS、MICPS及图片应用到webgis

气象数据通常以多种格式存储和交换,以适应不同的应用需求和处理工具。

weixin_42496466的博客 4632

Leaflet风向粒子实战:从风场JSON到粒子插件完整实现

地图可视化中,动态风场展示是气象数据呈现的重要方式,通过粒子动画能直观表达气流走向与风速分布。其底层原理是利用网格化的风场数据,将U/V风速分量映射为粒子位移轨迹,再叠加到Leaflet底图上形成流畅的动画效果。在技术选型时,核心是引入Leaflet本体与风向粒子插件,并准备好符合解析规范的JSON数据源,数据结构中的header网格参数与data风速数组缺一不可。这类技术广泛应用在气象监测、环境预警、航海航空等场景中,能显著提升数据认知效率。实际开发中,从数据格式转换、插件调用到参数调优环环相扣,一个常见

weixin_34008933的博客 332

netcdf-4.5.3.jar, netcdf-4.3.22.jar, netcdfAll-4.6.15.jar

netcdf-4.5.3.jar, netcdf-4.3.22.jar, netcdfAll-4.6.15.jar的jar包,不太好下载,放这记录下。好下载的5版本连接如下:https://github.com/Unidata/netcdf-java/releases

Copernicus再分析数据驱动的机器学习干旱预测Notebook实践

时间序列分类是把连续观测切分为带标签样本,再用模型估计未来状态概率的通用方法;其关键在于滑动窗口特征构造、标签口径与按时间切分验证。将Copernicus再分析气象栅格经xarray/netCDF4读取、裁剪和聚合为样本宽表,结合降水累计、距平、滞后与邻域统计做特征工程,并以XGBoost和PR-AUC评估不平衡场景,可把海量nc数据转化为可复现的干旱概率预测。该思路适用于气象、水文、农业遥感等区域干旱监测与预警,也能为Jupyter Notebook型数据项目提供从数据体检、特征标签到模型评估的工程骨架,

weixin_33845881的博客 287

Java读取解析GRIB2文件

Java读取、解析 GRIB2文件。测试数据:可下载GFS提供的:http://www.ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/

用于将grib格式转换为json格式的工具(基于grib2json)

用于将grib格式转换为json格式的工具(基于grib2json)

netcdfAll-5.1.0.jar

netcdfAll-5.1.0.jar

使用Java读取NetCDF格式数据

在WebGIS的开发过程中,有些时候会不可避免地接触到NetCDF格式的数据。NetCDF(network Common Data Form)格式的数据把对某一研究对象的多维信息归类在一起,它可以在任意一台操作系统进行创建、使用和分享。目前netCDF已经广泛用于地球物理、气象科学等领域。 NetCDF的文件后缀名为.nc,下面以某个nc文件为例,通过Java读取netCDF数据。该件为世界高程...

王诗阳的个人知识园地 5200

基于Java的NetCDF文件解析

基于Java语言的NetCDF文件解析,使用了netcdf4和opencsv两个库,最终将解析后的数据导出为CSV,附依赖文件、源代码及一个测试数据样例。 可结合本人的博客https://blog.youkuaiyun.com/weixin_41931518/article/details/125539137?spm=1001.2014.3001.5501进行使用。 若在使用过程中遇到疑惑,欢迎私聊。

netcdfAll-5.5.4-SNAPSHOT.jar

netcdfAll-5.5.4-SNAPSHOT.jar

合并大量netcdf数据的代码

共计2000多个nc数据,按照日期合并。

锐多宝的地理空间 580

深入理解DQN中的Q值:核心概念和应用

在强化学习中,Q值(或称为动作价值函数)是核心概念之一。Q值函数 ( Q(s, a) ) 表示在给定状态 ( s ) 下,采取动作 ( a ) 并遵循某策略后,智能体从当前状态到未来状态所能获得的预期总回报。简言之,Q值是评估特定状态和动作对的好坏的指标。

qlkaicx的博客 2975
上一篇: limit相关数据库优化
下一篇: DBeaver完美接入虚谷数据库使用教程
山水如墨染丶
博客等级 码龄8年 36粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值