java - 从 NetCDF 4.5 Grib2Record 中提取天气预报数据

标签 java hadoop netcdf grib

更新:更改了此问题以更好地反射(reflect)我当前的理解。

我有一个 NetCDF 版本 4.5 Grib2Record 对象。给定 (x,y) 网格点和变量名称,我想按预测时间从对象中提取该变量的所有预测数据(如果记录包含该变量的预测)。由于写入磁盘索引文件的默认行为,我不想使用更高级别的 NetCDFFile 接口(interface)。

我尝试查看较低级别的代码(Grib2Rectilyser、Grib2Customizer 等),但代码太密集,我正在寻求从哪里开始的帮助。

如果有任何关于如何获取 Grib2Record 的指示,我将不胜感激,并且 1. 检查其中是否包含特定的预测变量,2. 如果包含,则通过给定 x-y 的预测有效时间提取预测数据网格点和 z 级别。

最佳答案

我使用 grib2 文件进行风预测,这就是我获取记录以及如何处理它以获取风的方式(V U 组件)

Grib2Input input = new Grib2Input(getRandomAccessFile());
if (!input.scan(false, false)) {
    logger.error("Failed to successfully scan grib file");
    return;
}
Grib2Data data = new Grib2Data(getRandomAccessFile());

List<Grib2Record> records = input.getRecords();

for (Grib2Record record : records) {    
    Grib2IndicatorSection is = record.getIs();
    Grib2IdentificationSection id = record.getId();
    Grib2Pds pdsv = record.getPDS().getPdsVars();
    Grib2GDSVariables gdsv = record.getGDS().getGdsVars();

    long time = id.getRefTime() + (record.getPDS().getForecastTime() * 3600000);

    logger.debug("Record description at " + pdsv.getReferenceDate() + " forecast "
    + new Date(time)    + ": " + ParameterTable.getParameterName(is.getDiscipline(), pdsv.getParameterCategory(), pdsv.getParameterNumber()));

    float[] values = data.getData(record.getGdsOffset(), record.getPdsOffset(), 0);

     if ((is.getDiscipline() == 0) && (pdsv.getParameterCategory() == 2) && (pdsv.getParameterNumber() == 2)) {
        // U-component_of_wind
        int c = 0;
        for (double lat = gdsv.getLa1(); lat >= gdsv.getLa2(); lat = lat - gdsv.getDy()) {
            for (double lon = gdsv.getLo1(); lon <= gdsv.getLo2(); lon = lon + gdsv.getDx()) {
                logger.debug(lat + "\t" + lon + "\t" +
                values[c]);
                c++;
            }
        }
    } else if ((is.getDiscipline() == 0) && (pdsv.getParameterCategory() == 2) && (pdsv.getParameterNumber() == 3)) {
        // V-component_of_wind
        int c = 0;
        for (double lat = gdsv.getLa1(); lat >= gdsv.getLa2(); lat = lat - gdsv.getDy()) {
            for (double lon = gdsv.getLo1(); lon <= gdsv.getLo2(); lon = lon + gdsv.getDx()) {
                logger.debug(lat + "\t" + lon + "\t" +
                values[c]);
                c++;
            }
        }
    }
}

private RandomAccessFile getRandomAccessFile() {
    RandomAccessFile raf = null;
    try {
        raf = new RandomAccessFile(path, "r");
        raf.order(RandomAccessFile.BIG_ENDIAN);
    } catch (IOException e) {
        logger.error("Error opening file " + path, e);
    }
    return raf;
}

关于java - 从 NetCDF 4.5 Grib2Record 中提取天气预报数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823650/

相关文章:

java - Spring H2数据库EmbeddedDatabaseFactory连接URL错误

java - 变量年份可能尚未初始化

java - 在Google Appengine中使用MapOnlyMapper时出现RetryHandler异常

java - org.apache.hadoop.io.Text无法转换为org.apache.hadoop.io.NullWritable

python - 始终使用 netCDF4 生成屏蔽数组

fortran - 在 NetCDF 中沿无限维度写入标量变量

java - 与 Jackrabbit 聚类

ubuntu - 安装 hadoop 时出现“HADOOP_COMMON_HOME”错误

python - 如何在Python中将netCDF4文件转换为ASCII格式文件以获取特殊网格点?

java - 将字符串转换为 double - JAVA