ingo@392: package de.intevation.flys.exports;
ingo@1679:
felix@1915: import java.util.List;
felix@1915: import java.util.ArrayList;
felix@1915:
ingo@392: import org.apache.log4j.Logger;
ingo@392:
ingo@392: import org.w3c.dom.Document;
ingo@392:
ingo@414: import org.jfree.chart.JFreeChart;
ingo@414: import org.jfree.chart.title.TextTitle;
ingo@923: import org.jfree.data.xy.XYSeries;
ingo@414:
felix@1944: import de.intevation.artifactdatabase.state.ArtifactAndFacet;
ingo@695: import de.intevation.artifactdatabase.state.Facet;
ingo@695:
felix@3054: import de.intevation.flys.artifacts.StaticWKmsArtifact;
felix@2731: import de.intevation.flys.artifacts.WINFOArtifact;
felix@2731:
ingo@696: import de.intevation.flys.artifacts.model.FacetTypes;
ingo@393: import de.intevation.flys.artifacts.model.WQKms;
felix@2731: import de.intevation.flys.artifacts.model.WKms;
felix@1085:
felix@1850: import de.intevation.flys.jfree.FLYSAnnotation;
felix@1915: import de.intevation.flys.jfree.StickyAxisAnnotation;
ingo@2074: import de.intevation.flys.jfree.StyledXYSeries;
felix@1850:
ingo@392:
ingo@392: /**
ingo@392: * An OutGenerator that generates discharge curves.
ingo@392: *
ingo@392: * @author Ingo Weinzierl
ingo@392: */
ingo@696: public class ComputedDischargeCurveGenerator
ingo@696: extends DischargeCurveGenerator
ingo@696: implements FacetTypes
ingo@696: {
felix@1081: /** The logger used in this generator. */
ingo@392: private static Logger logger =
ingo@392: Logger.getLogger(ComputedDischargeCurveGenerator.class);
ingo@392:
ingo@408: public static final String I18N_CHART_TITLE =
ingo@408: "chart.computed.discharge.curve.title";
ingo@408:
ingo@414: public static final String I18N_CHART_SUBTITLE =
ingo@414: "chart.computed.discharge.curve.subtitle";
ingo@414:
ingo@408: public static final String I18N_YAXIS_LABEL =
ingo@408: "chart.computed.discharge.curve.yaxis.label";
ingo@408:
ingo@408: public static final String I18N_CHART_TITLE_DEFAULT = "Abflusskurve";
ingo@408: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]";
felix@1092: public static final String I18N_MAINVALUES_Q_LABEL = "Q (Haupt- und Extremwerte)";
felix@1092: public static final String I18N_MAINVALUES_W_LABEL = "W (Haupt- und Extremwerte)";
ingo@408:
felix@1083:
felix@1083: /** Trivial Constructor. */
felix@1083: public ComputedDischargeCurveGenerator () {
felix@1083: super();
felix@1083: }
felix@1083:
ingo@408:
ingo@392: @Override
ingo@2048: protected String getDefaultChartTitle() {
ingo@408: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
ingo@400: }
ingo@400:
ingo@400:
ingo@400: @Override
ingo@2048: protected String getDefaultChartSubtitle() {
felix@1113: double[] dist = getRange();
ingo@414:
ingo@414: Object[] args = new Object[] {
ingo@414: getRiverName(),
ingo@414: dist[0]
ingo@414: };
ingo@414:
ingo@1989: return msg(I18N_CHART_SUBTITLE, "", args);
ingo@1989: }
ingo@1989:
ingo@1989:
ingo@1989: @Override
ingo@1989: protected void addSubtitles(JFreeChart chart) {
ingo@1989: String subtitle = getChartSubtitle();
ingo@2048:
ingo@2048: if (subtitle != null && subtitle.length() > 0) {
ingo@2048: chart.addSubtitle(new TextTitle(subtitle));
ingo@2048: }
ingo@414: }
ingo@414:
ingo@414:
ingo@414: @Override
ingo@2051: protected String getDefaultYAxisLabel(int pos) {
ingo@408: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
ingo@400: }
ingo@400:
ingo@400:
felix@2731: /**
felix@2731: * Process data, build up plot.
felix@2731: */
ingo@400: @Override
ingo@1684: public void doOut(
felix@1944: ArtifactAndFacet artifactFacet,
felix@1944: Document attr,
felix@1944: boolean visible
ingo@1684: ) {
felix@1944: String name = artifactFacet.getFacetName();
ingo@393:
ingo@696: logger.debug("ComputedDischargeCurveGenerator.doOut: " + name);
ingo@393:
felix@1085: if (name == null) {
felix@1085: logger.warn("Broken facet in computed discharge out generation.");
felix@1085: return;
felix@1085: }
felix@1085:
felix@1944: Facet facet = artifactFacet.getFacet();
ingo@696:
felix@1083: if (name.equals(COMPUTED_DISCHARGE_Q)) {
ingo@2605: doQOut((WQKms) artifactFacet.getData(context), artifactFacet, attr, visible);
ingo@696: }
felix@1901: else if (name.equals(STATIC_WQ)) {
ingo@2605: doWQOut(artifactFacet.getData(context), artifactFacet, attr, visible);
felix@1901: }
felix@1915: else if (name.equals(STATIC_WQ_ANNOTATIONS)) {
ingo@2325: doWQAnnotations(
ingo@2325: artifactFacet.getData(context),
ingo@2325: artifactFacet,
ingo@2325: attr,
ingo@2325: visible);
felix@1915: }
felix@1812: else if (name.equals(COMPUTED_DISCHARGE_MAINVALUES_Q)
felix@1850: || name.equals(MAINVALUES_Q)
felix@1850: || name.equals(COMPUTED_DISCHARGE_MAINVALUES_W)
felix@1850: || name.equals(MAINVALUES_W)
felix@1850: ) {
felix@1850: doAnnotations((FLYSAnnotation)
ingo@2325: artifactFacet.getData(context), artifactFacet, attr, visible);
felix@1083: }
felix@2731: else if (name.equals(STATIC_WKMS_INTERPOL) || name.equals(HEIGHTMARKS_POINTS)) {
ingo@2325: doWAnnotations(
ingo@2325: artifactFacet.getData(context),
ingo@2325: artifactFacet,
ingo@2325: attr,
ingo@2325: visible);
felix@1921: }
felix@2769: else if (name.equals(STATIC_WKMS)) {
felix@2769: doWAnnotations(
felix@2769: artifactFacet.getData(context),
felix@2769: artifactFacet,
felix@2769: attr,
felix@2769: visible);
felix@2769: }
felix@2206: else if (FacetTypes.IS.MANUALPOINTS(name)) {
felix@2206: doPoints(artifactFacet.getData(context),
ingo@2325: artifactFacet,
felix@2206: attr, visible, YAXIS.W.idx);
felix@2206: }
felix@2731: else if (name.equals(DISCHARGE_CURVE)) {
felix@2731: doDischargeOut(
felix@2731: (WINFOArtifact) artifactFacet.getArtifact(),
felix@2731: artifactFacet.getData(context),
felix@2731: artifactFacet.getFacetDescription(),
felix@2731: attr,
felix@2731: visible);
felix@2731: }
ingo@696: else {
ingo@696: logger.warn("Unknown facet type for computed discharge: " + name);
ingo@696: return;
ingo@696: }
ingo@696: }
ingo@696:
felix@2206:
felix@1901: /**
felix@1901: * Add WQ Data to plot.
felix@2570: * @param wqkms data as double[][]
felix@1901: */
felix@1901: protected void doWQOut(
ingo@2605: Object wqkms,
ingo@2605: ArtifactAndFacet aaf,
ingo@2605: Document theme,
ingo@2605: boolean visible
felix@1901: ) {
felix@3054: logger.debug("ComputedDischargeCurveGenerator: doWQOut");
felix@1901: double [][] data = (double [][]) wqkms;
felix@1901:
ingo@2605: XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
felix@2685: StyledSeriesBuilder.addPoints(series, data, true);
felix@1902:
felix@1933: addAxisSeries(series, YAXIS.W.idx, visible);
felix@1901: }
ingo@696:
felix@1944:
felix@1083: /**
felix@1083: * Add Q-Series to plot.
felix@1083: * @param wqkms actual data
felix@1083: * @param theme theme to use.
felix@1083: */
ingo@1712: protected void doQOut(
ingo@2605: WQKms wqkms,
ingo@2605: ArtifactAndFacet aaf,
ingo@2605: Document theme,
ingo@2605: boolean visible
ingo@1712: ) {
felix@3054: logger.debug("ComputedDischargeCurveGenerator: doWQOut");
ingo@2605: XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
felix@1902: StyledSeriesBuilder.addPointsQW(series, wqkms);
ingo@393:
felix@1933: addAxisSeries(series, YAXIS.W.idx, visible);
ingo@393: }
felix@1915:
felix@1915:
felix@1915: /**
felix@1915: * Add WQ-Annotations to plot.
felix@1915: * @param wqkms actual data
felix@1915: * @param theme theme to use.
felix@1915: */
felix@1915: protected void doWQAnnotations(
felix@1915: Object wqkms,
ingo@2325: ArtifactAndFacet aandf,
felix@1915: Document theme,
felix@1915: boolean visible
felix@1915: ) {
felix@2161: List xy = new ArrayList();
felix@1915: double [][] data = (double [][]) wqkms;
felix@1915: for (int i = 0; i< data[0].length; i++) {
felix@3054: // TODO we need linear interpolation?
ingo@2325: xy.add(new StickyAxisAnnotation(aandf.getFacetDescription(),
felix@1915: (float) data[0][i], StickyAxisAnnotation.SimpleAxis.X_AXIS));
ingo@2325: xy.add(new StickyAxisAnnotation(aandf.getFacetDescription(),
felix@1915: (float) data[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS));
felix@1915: }
felix@1915:
ingo@2325: doAnnotations(new FLYSAnnotation(aandf.getFacetDescription(), xy),
ingo@2325: aandf, theme, visible);
felix@1915: }
felix@1921:
felix@1944:
felix@1921: /**
felix@1921: * Add W-Annotations to plot.
felix@2570: * @param wqkms actual data (double[][]).
felix@1921: * @param theme theme to use.
felix@1921: */
felix@1921: protected void doWAnnotations(
felix@1921: Object wqkms,
ingo@2325: ArtifactAndFacet aandf,
felix@1921: Document theme,
felix@1921: boolean visible
felix@1921: ) {
ingo@2325: Facet facet = aandf.getFacet();
ingo@2325:
felix@2161: List xy = new ArrayList();
felix@2731: // Try to find them as WKms as well...
felix@2731: if (wqkms instanceof double[][]) {
felix@3054: logger.debug("its double[][] time, baby");
felix@2731: double [][] data = (double [][]) wqkms;
felix@3054: // TODO Do we need interpolation?
felix@2731: for (int i = 0; i< data[0].length; i++) {
felix@2731: xy.add(new StickyAxisAnnotation(aandf.getFacetDescription(),
felix@2731: (float) data[1][i], StickyAxisAnnotation.SimpleAxis.Y_AXIS));
felix@2731: }
felix@2731:
felix@2731: doAnnotations(new FLYSAnnotation(facet.getDescription(), xy),
felix@2731: aandf, theme, visible);
felix@2731: }
felix@2731: else {
felix@3054: logger.debug("its wkms time, baby");
felix@2731: WKms data = (WKms) wqkms;
felix@3054: // Assume its WKms.
felix@3054: double location = getRange()[0];
felix@3054: double w = ((StaticWKmsArtifact) aandf.getArtifact())
felix@3054: .getWAtKmLin(data, getRange()[0]);
ingo@2325: xy.add(new StickyAxisAnnotation(aandf.getFacetDescription(),
felix@3054: (float) w, StickyAxisAnnotation.SimpleAxis.Y_AXIS));
felix@2731:
felix@2731: doAnnotations(new FLYSAnnotation(facet.getDescription(), xy),
felix@2731: aandf, theme, visible);
felix@1921: }
felix@1921: }
ingo@392: }
ingo@392: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :