Извлечь данные прогноза погоды из NetCDF 4.5 Grib2Record

Обновление: изменен этот вопрос, чтобы лучше отразить мое текущее понимание.

У меня есть объект Grib2Record NetCDF версии 4.5. Учитывая точку сетки (x, y) и имя переменной, я хочу извлечь все данные прогноза для этой переменной по времени прогноза из объекта (если запись содержит прогноз для этой переменной). Из-за поведения по умолчанию записи индексного файла диска я не хочу использовать интерфейс NetCDFFile более высокого уровня.

Я пробовал смотреть на код более низкого уровня (Grib2Rectilyser, Grib2Customizer и т. Д.), Но код слишком плотный, и я ищу помощь, с чего начать.

Я был бы признателен за любые указатели о том, как взять Grib2Record и 1. проверить, содержится ли в нем конкретная переменная прогноза, и 2. если да, то извлечь данные прогноза по времени действия прогноза для данной точки сетки xy и z-уровень.


person Innuo    schedule 07.01.2015    source источник


Ответы (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;
}
person Pablo Gallego Falcón    schedule 15.01.2015
comment
Не могли бы вы подробнее сформулировать свой ответ? Что такое переменная данных? Как получить имя переменной, широту и долготу, уровень z и т. Д.? - person Innuo; 16.01.2015