package com.meteogroup.grib2geotiff.grib;
import java.awt.geom.Rectangle2D;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import ucar.grib.grib2.Grib2GDSVariables;
import ucar.grib.grib2.Grib2GridDefinitionSection;
import ucar.grib.grib2.Grib2IdentificationSection;
import ucar.grib.grib2.Grib2IndicatorSection;
import ucar.grib.grib2.Grib2Pds;
import ucar.grib.grib2.Grib2ProductDefinitionSection;
import ucar.grib.grib2.Grib2Record;
import ucar.grib.grib2.Grib2Tables;
import ucar.grib.grib2.ParameterTable;
import com.meteogroup.grib2geotiff.RecordMetadata;
/**
* Created by danielt on 25.09.15.
*/
public class GribMetadataReader {
private static Grib2IndicatorSection is;
private static Grib2IdentificationSection id;
private static Grib2GDSVariables gdsv;
private static Grib2Pds pdsv;
private static Grib2ProductDefinitionSection pds;
private static Grib2GridDefinitionSection gds;
/**
* @param record
* @return
*/
public static RecordMetadata getGfsRecordMetadata(Grib2Record record) {
inferMetadataObjects(record);
RecordMetadata metadata = new RecordMetadata();
applyCommonMetadata(metadata);
applyTimeMetadata(metadata);
applyLevelMetadata(metadata);
applyBboxMetadata(metadata);
return metadata;
}
/**
* @param record
*/
private static void inferMetadataObjects(Grib2Record record) {
is = record.getIs();
id = record.getId();
gds = record.getGDS();
pds = record.getPDS();
pdsv = pds.getPdsVars();
gdsv = gds.getGdsVars();
}
/**
* @param metadata
*/
private static void applyBboxMetadata(RecordMetadata metadata) {
metadata.setBbox(new Rectangle2D.Double(gdsv.getLo1(), gdsv.getLa1(), gdsv.getLo2(), gdsv.getLa2()));
}
/**
* @param metadata
*/
private static void applyLevelMetadata(RecordMetadata metadata) {
String level1Type = pdsv.getLevelType1() + " " + Grib2Tables.codeTable4_5(pdsv.getLevelType1());
if (pdsv.getLevelType1() != 255) {
metadata.setLevelType1(Grib2Tables.codeTable4_5(pdsv.getLevelType1()));
metadata.setLevelValue1(pdsv.getLevelValue1());
}
if (pdsv.getLevelType2() != 255) {
metadata.setLevelType2(Grib2Tables.codeTable4_5(pdsv.getLevelType2()));
metadata.setLevelValue2(pdsv.getLevelValue2());
}
}
/**
* @param metadata
*/
private static void applyTimeMetadata(RecordMetadata metadata) {
DateTime referenceTimeUtc = new DateTime(pdsv.getReferenceTime(), DateTimeZone.UTC);
metadata.setReferenceTime(referenceTimeUtc.getMillis());
DateTime forecastTimeUtc = new DateTime(referenceTimeUtc.plusHours(pdsv.getForecastTime()));
metadata.setForecastTime(forecastTimeUtc.getMillis());
}
/**
* @param metadata
*/
private static void applyCommonMetadata(RecordMetadata metadata) {
metadata.setId(pdsv.getParameterNumber());
metadata.setCategory(ParameterTable.getCategoryName(is.getDiscipline(), pdsv.getParameterCategory()));
metadata.setName(ParameterTable.getParameterName(is.getDiscipline(), pdsv.getParameterCategory(), pdsv.getParameterNumber()));
metadata.setUnit(ParameterTable.getParameterUnit(is.getDiscipline(), pdsv.getParameterCategory(), pdsv.getParameterNumber()));
metadata.setColumns(gdsv.getNx());
metadata.setRows(gdsv.getNy());
}
}