2015-01-07 3 views
2

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

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

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

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

ответ

3

Я работал с GRIB2 файлов для духовых предсказаний, то это, как я получаю записи и как обрабатывать его, чтобы получить ветер (компоненты VU)

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; 
} 
+0

Можете ли вы конкретизации ваш ответ больше? Что такое переменная данных? Как вы получаете имя переменной, уровень lat/lons, z и т. Д.? – Innuo

+0

Проверьте отредактированную версию кода. –