【问题标题】:Extract weather forecast data from NetCDF 4.5 Grib2Record从 NetCDF 4.5 Grib2Record 中提取天气预报数据
【发布时间】:2015-03-05 14:17:03
【问题描述】:

更新:更改了这个问题以更好地反映我目前的理解。

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

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

我将不胜感激有关如何获取 Grib2Record 和 1. 检查特定预测变量是否包含在其中的任何指示,以及 2. 如果是,则通过给定 xy 的预测有效时间提取预测数据网格点和 z 水平。

【问题讨论】:

    标签: java hadoop netcdf grib


    【解决方案1】:

    我使用 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;
    }
    

    【讨论】:

    • 您能否详细说明您的答案?什么是数据变量?如何获取变量的名称、纬度/经度、z 水平等?
    猜你喜欢
    • 2016-01-02
    • 2012-11-01
    • 2019-06-10
    • 2011-05-16
    • 1970-01-01
    • 2013-06-22
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多