netcdfAll介绍
1. 技术优势
1)标准化支持:NetCDF库支持标准的GRIB、NC格式数据,确保你能够处理大多数常见的气象文件数据。
2)易于集成:通过简单的步骤,你可以将netcdfAll-4.6.11.jar包集成到你的Java项目中,快速开始解码工作。
2. NetCDF库重点结构
- NetcdfFile(文件对象)类
文件主类 - Dimensions(维度)类
定义数据的维度,如时间、纬度、经度等。 - Variables(变量)类
存储实际数据,每个变量可以有一个或多个维度。 - Attributes(属性)类
存储元数据,如单位、描述等,可以附加到文件、变量或维度上。 - 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);
}
}
}