ingo@359: package de.intevation.flys.exports; ingo@359: ingo@359: import org.apache.log4j.Logger; ingo@359: ingo@375: import org.jfree.chart.JFreeChart; ingo@375: import org.jfree.chart.axis.NumberAxis; ingo@375: import org.jfree.chart.plot.XYPlot; ingo@369: import org.jfree.data.xy.XYSeries; ingo@369: import org.jfree.data.xy.XYSeriesCollection; ingo@364: ingo@359: import org.w3c.dom.Document; ingo@359: ingo@359: import de.intevation.artifacts.Artifact; ingo@359: ingo@364: import de.intevation.flys.artifacts.WINFOArtifact; ingo@364: import de.intevation.flys.artifacts.model.WQKms; ingo@364: ingo@359: ingo@359: /** ingo@359: * An OutGenerator that generates discharge curves. ingo@359: * ingo@359: * @author Ingo Weinzierl ingo@359: */ ingo@369: public class LongitudinalSectionGenerator extends XYChartGenerator { ingo@359: ingo@359: /** The logger that is used in this generator.*/ ingo@359: private static Logger logger = ingo@359: Logger.getLogger(LongitudinalSectionGenerator.class); ingo@359: ingo@359: ingo@369: public static final String LONGITUDINAL_SECTION_W = ingo@369: "longitudinal_section.w"; ingo@369: ingo@369: public static final String LONGITUDINAL_SECTION_Q = ingo@369: "longitudinal_section.q"; ingo@369: ingo@369: ingo@375: /** The storage for the W series to be drawn in this chart.*/ ingo@375: protected XYSeriesCollection w; ingo@375: ingo@375: /** The storage for the Q series to be drawn in this chart.*/ ingo@375: protected XYSeriesCollection q; ingo@364: ingo@364: ingo@359: public LongitudinalSectionGenerator() { ingo@359: super(); ingo@364: ingo@375: this.w = new XYSeriesCollection(); ingo@375: this.q = new XYSeriesCollection(); ingo@369: } ingo@369: ingo@369: ingo@369: protected String getChartTitle() { ingo@369: // TODO i18n ingo@369: return "Wasserstand für Gewässer"; ingo@369: } ingo@369: ingo@369: ingo@369: protected String getXAxisLabel() { ingo@369: return "km"; ingo@369: } ingo@369: ingo@369: ingo@369: protected String getYAxisLabel() { ingo@369: return "W [NN + m]"; ingo@369: } ingo@369: ingo@369: ingo@375: protected void addDatasets(JFreeChart chart) { ingo@375: XYPlot plot = (XYPlot) chart.getPlot(); ingo@375: ingo@375: plot.setDataset(0, w); ingo@375: plot.setDataset(1, q); ingo@375: } ingo@375: ingo@375: ingo@375: protected void adjustAxes(XYPlot plot) { ingo@375: super.adjustAxes(plot); ingo@375: ingo@375: NumberAxis qAxis = new NumberAxis("Q [m³/s]"); ingo@375: ingo@375: plot.setRangeAxis(2, qAxis); ingo@375: plot.mapDatasetToRangeAxis(1, 2); ingo@359: } ingo@359: ingo@359: ingo@364: public void doOut(Artifact artifact, String facet, Document attr) { ingo@364: logger.debug("LongitudinalSectionGenerator.doOut: " + facet); ingo@359: ingo@369: if (facet == null) { ingo@369: logger.error("No facet name for doOut(). No output generated!"); ingo@369: return; ingo@369: } ingo@369: ingo@369: if (facet.equals(LONGITUDINAL_SECTION_W)) { ingo@369: doWOut(getWaterlevelData(artifact)); ingo@369: } ingo@369: else if (facet.equals(LONGITUDINAL_SECTION_Q)) { ingo@369: doQOut(getWaterlevelData(artifact)); ingo@369: } ingo@369: else { ingo@369: logger.warn("Unknown facet name: " + facet); ingo@369: return; ingo@369: } ingo@369: } ingo@369: ingo@369: ingo@369: /** ingo@369: * Returns the waterlevel data computed by the WINFOArtifact. ingo@369: * ingo@369: * @param artifact The WINFOArtifact. ingo@369: * ingo@369: * @return the computed waterlevel data. ingo@369: */ ingo@369: protected WQKms[] getWaterlevelData(Artifact artifact) { ingo@364: WINFOArtifact winfoArtifact = (WINFOArtifact) artifact; ingo@364: WQKms[] wqkms = winfoArtifact.getWaterlevelData(); ingo@364: ingo@364: logger.debug("Got " + wqkms.length + " WQKms objects."); ingo@369: ingo@369: return wqkms; ingo@359: } ingo@359: ingo@359: ingo@369: /** ingo@369: * Process the output for W facets in a longitudinal section curve. ingo@369: * ingo@369: * @param wqkms An array of WQKms values. ingo@369: */ ingo@369: protected void doWOut(WQKms[] wqkms) { ingo@369: logger.debug("LongitudinalSectionGenerator.doWOut"); ingo@359: ingo@369: int idx = 0; ingo@369: for (WQKms tmp: wqkms) { ingo@369: XYSeries series = new XYSeries(getSeriesName(tmp, "w", idx++)); ingo@369: ingo@369: double[] target = new double[3]; ingo@369: int size = tmp.size(); ingo@369: ingo@369: if (logger.isDebugEnabled()) { ingo@369: logger.debug("Generate series: " + series.getKey()); ingo@369: ingo@369: logger.debug("Start km: " + tmp.getKms(0)); ingo@369: logger.debug("End km: " + tmp.getKms(size-1)); ingo@369: logger.debug("Values : " + size); ingo@369: } ingo@369: ingo@369: for (int i = 0; i < size; i++) { ingo@369: target = tmp.get(i, target); ingo@369: ingo@369: logger.debug("++ W Tuple: " + target[2] + " -> " + target[0]); ingo@369: series.add(target[2], target[0]); ingo@369: } ingo@369: ingo@375: w.addSeries(series); ingo@369: } ingo@369: } ingo@369: ingo@369: ingo@369: /** ingo@369: * Process the output for Q facets in a longitudinal section curve. ingo@369: * ingo@369: * @param wqkms An array of WQKms values. ingo@369: */ ingo@369: protected void doQOut(WQKms[] wqkms) { ingo@369: logger.debug("LongitudinalSectionGenerator.doQOut"); ingo@369: ingo@369: int idx = 0; ingo@369: for (WQKms tmp: wqkms) { ingo@369: XYSeries series = new XYSeries(getSeriesName(tmp, "Q", idx++)); ingo@369: ingo@369: double[] target = new double[3]; ingo@369: int size = tmp.size(); ingo@369: ingo@369: if (logger.isDebugEnabled()) { ingo@369: logger.debug("Generate series: " + series.getKey()); ingo@369: ingo@369: logger.debug("Start km: " + tmp.getKms(0)); ingo@369: logger.debug("End km: " + tmp.getKms(size-1)); ingo@369: logger.debug("Values : " + size); ingo@369: } ingo@369: ingo@369: for (int i = 0; i < size; i++) { ingo@369: target = tmp.get(i, target); ingo@369: ingo@369: logger.debug("++ Q Tuple: " + target[2] + " -> " + target[1]); ingo@369: series.add(target[2], target[1]); ingo@369: } ingo@369: ingo@375: q.addSeries(series); ingo@369: } ingo@369: } ingo@369: ingo@369: ingo@369: protected String getSeriesName(WQKms wqkms, String prefix, int idx) { ingo@369: return prefix + "-" + idx; ingo@359: } ingo@359: } ingo@359: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :