1.简介
可以实现在线下载欧洲公开预报数据,本帖以下载指定区域降雨量数据为例
本人亲测,完全可以正常拉取以及解析入库(如有问题可以留言)
2.公开数据下载地址
同一时间段内他有两个数据格式文件,grib2文件代表的是气象数据文件,index代表的是各种类型所对应的索引
3.下载数据相关参数介绍
官网解释地址:ECMWF开放数据:来自IFS和AIFS的实时预测 - 数据和图表 - ECMWF Confluence Wiki
以上地址中有关于各个文件包含的数据内容,可以根据该提示选择自己所需要的数据
4.文件解析
3.1工具下载: wgrib2(下载地址)
3.2 指令介绍
由于grib2文件数据集比较大,我是先将所需要的区域进行提取出来在进行分析处理
1.按照经纬度,只提取自己所需区域(执行命令需要在wgrib目录下执行,或者cd 进入到该目录下)
wgrib3 20240322000000-0h-oper-fc.grib2 -small_grib 102:104 24:27 D:\\OZ\\custom.grib2
2.筛选出自己所需数据类型(193是过滤降雨的相关数据)
wgrib3 -s D:\\OZ\\custom.grib2 | findstr "parm=193" | wgrib3 -i D:\\OZ\\custom.grib2 -csv D:\ozGribFile\20240321\result.csv
3.代码进行csv文件读取,进行数据处理以及入库分析
使用的辅助jar包(junit-jupiter-api-5.3.2.jar)
public List<String[]> parseCSV(String fileName) {
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setLineSeparatorDetectionEnabled(true);
RowListProcessor rowListProcessor = new RowListProcessor();
parserSettings.setProcessor((Processor)rowListProcessor);
parserSettings.setHeaderExtractionEnabled(true);
parserSettings.setLineSeparatorDetectionEnabled(true);
CsvParser parser = new CsvParser(parserSettings);
parser.parse(new File(fileName));
String[] headers = rowListProcessor.getHeaders();
List<String[]> rows = rowListProcessor.getRows();
return rows;
}
然后进行数据读取,以及相关入库操作
<---关于java代码执行cmd指令代码示例:(如果大佬们有更好的改进,希望指点一下,3q)--->
saveFilePath -> 文件下载保存路径
String[] cmd = new String[6];
cmd[0] = "cmd ";
cmd[1] = "/c ";
cmd[2] = "start ";
cmd[3] = "E:\\elitel\\FtpGRB\\wgrib";//替换为自己wgrib程序所在位置
cmd[4] = " wgrib3 " + saveFilePath + " -small_grib 102:104 24:27 " + saveFilePath.replace(".","_small.");
cmd[5] = " wgrib3 " + saveFilePath.replace(".","_small.") + " | findstr \"193\" | wgrib3 -i "+saveFilePath.replace(".","_small.")+" -csv " + CsvPath;
System.out.println("cmd命令开始执行!!!");
Process p1 = execCMD(cmd, 4);
p1.waitFor();
Process p2 = execCMD(cmd, 5);
p2.waitFor();
System.out.println("cmd命令执行结束!!!" );
System.out.println("文件处理完成" + CsvPath);
/*
进行相关csv文件分析,以及入库等后续操作
*/
}
@NotNull
private Process execCMD(String[] cmd, int i) throws IOException {
Process p1 = Runtime.getRuntime().exec(cmd[0] + cmd[1] + cmd[i], (String[]) null, new File(cmd[3]));
BufferedReader br = new BufferedReader(new InputStreamReader(p1.getInputStream()));
String line;
while ((line = br.readLine()) != null)
System.out.println(line);
return p1;
}