Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java @ 3169:b6da650b0718
FixA: Added longitudinal section chart.
flys-artifacts/trunk@4782 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Mon, 25 Jun 2012 15:53:34 +0000 |
parents | |
children | 70966b52c073 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java Mon Jun 25 15:53:34 2012 +0000 @@ -0,0 +1,344 @@ +package de.intevation.flys.exports.fixings; + +import java.util.List; +import java.util.ArrayList; + +import java.awt.BasicStroke; +import java.awt.Color; + +import de.intevation.artifactdatabase.state.ArtifactAndFacet; + +import de.intevation.flys.artifacts.model.FacetTypes; + +import de.intevation.flys.artifacts.model.fixings.DateRange; +import de.intevation.flys.artifacts.model.fixings.FixFunction; +import de.intevation.flys.artifacts.model.fixings.FixWQCurveFacet; +import de.intevation.flys.artifacts.model.fixings.QW; +import de.intevation.flys.artifacts.model.fixings.QWD; +import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod; + +import de.intevation.flys.exports.ChartGenerator; +import de.intevation.flys.exports.XYChartGenerator; + +import de.intevation.flys.jfree.Function2DAdapter; +import de.intevation.flys.jfree.StyledXYSeries; +import de.intevation.flys.jfree.StyledAreaSeriesCollection; + +import de.intevation.flys.utils.KMIndex; + +import org.apache.log4j.Logger; + +import org.jfree.data.general.DatasetUtilities; + +import org.jfree.data.xy.XYSeries; +import org.jfree.chart.plot.Marker; +import org.jfree.chart.plot.ValueMarker; +import org.jfree.data.xy.XYSeriesCollection; + +import org.w3c.dom.Document; + +public class FixLongitudinalSectionGenerator +extends XYChartGenerator +implements FacetTypes +{ + private static Logger logger = + Logger.getLogger(FixLongitudinalSectionGenerator.class); + + public static final String I18N_CHART_TITLE = + "chart.fixings.longitudinalsection.title"; + + public static final String I18N_CHART_SUBTITLE = + "chart.fixings.longitudinalsection.subtitle"; + + public static final String I18N_XAXIS_LABEL = + "chart.fixings.longitudinalsection.xaxis.label"; + + public static final String I18N_YAXIS_LABEL = + "chart.fixings.longitudinalsection.yaxis.label"; + + public static final String I18N_CHART_TITLE_DEFAULT = + "Fixierungsanalyse"; + + public static final String I18N_XAXIS_LABEL_DEFAULT = + "[m]"; + + public static final String I18N_YAXIS_LABEL_DEFAULT = + "delta W [cm]"; + + public static enum YAXIS { + dW(0); + public int idx; + private YAXIS(int c) { + idx = c; + } + } + + @Override + public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) { + String name = aaf.getFacetName(); + logger.debug("doOut: " + name); + + if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) { + doSectorAverageDeviationOut(aaf, doc, visible); + } + else if (name.contains(FIX_SECTOR_AVERAGE_LS)) { + doSectorAverageOut(aaf, doc, visible); + } + else if (name.equals(FIX_REFERENCE_EVENTS_LS)) { + doReferenceEventsOut(aaf, doc, visible); + } + else if (name.equals(FIX_ANALYSIS_EVENTS_LS)) { + doAnalysisEventsOut(aaf, doc, visible); + } + else if (name.equals(FIX_DEVIATION_LS)) { + doReferenceDeviationOut(aaf, doc, visible); + } + else { + logger.warn("Unknown facet name " + name); + return; + } + } + + protected void doSectorAverageOut( + ArtifactAndFacet aaf, + Document doc, + boolean visible) + { + logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex()); + + int index = aaf.getFacet().getIndex(); + int sectorNdx = index & 3; + int periodNdx = index >> 2; + + KMIndex<AnalysisPeriod[]> kms = + (KMIndex<AnalysisPeriod[]>)aaf.getData(context); + + if(kms == null) { + return; + } + + XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), doc); + + for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) { + double km = entry.getKm(); + AnalysisPeriod[] ap = entry.getValue(); + QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx]; + if (qwd == null) { + continue; + } + double deltaW = qwd.getDeltaW(); + series.add(km, deltaW); + } + + addAxisSeries(series, 0, visible); + + } + + + protected void doSectorAverageDeviationOut( + ArtifactAndFacet aaf, + Document doc, + boolean visible) + { + logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex()); + + int index = aaf.getFacet().getIndex(); + int sectorNdx = index & 3; + int periodNdx = index >> 2; + + KMIndex<AnalysisPeriod[]> kms = + (KMIndex<AnalysisPeriod[]>)aaf.getData(context); + + if(kms == null) { + return; + } + + StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); + XYSeries upper = + new StyledXYSeries(aaf.getFacetDescription(), false, doc); + XYSeries lower = + new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc); + + + for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) { + double km = entry.getKm(); + AnalysisPeriod[] ap = entry.getValue(); + QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx]; + double dev = ap[periodNdx].getQSectorStdDev(sectorNdx); + logger.debug("std-dev: " + dev); + if (qwd == null) { + continue; + } + double deltaW = qwd.getDeltaW(); + double up = deltaW + dev; + double lo = deltaW - dev; + upper.add(km, up); + lower.add(km, lo); + } + area.addSeries(upper); + area.addSeries(lower); + + addAreaSeries(area, 0, visible); + } + + + protected void doReferenceDeviationOut( + ArtifactAndFacet aaf, + Document doc, + boolean visible) + { + logger.debug("doReferenceOut"); + + KMIndex<double[]> kms = + (KMIndex<double[]>)aaf.getData(context); + + if(kms == null) { + return; + } + + StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); + XYSeries upper = + new StyledXYSeries(aaf.getFacetDescription(), false, doc); + XYSeries lower = + new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc); + + + for (KMIndex.Entry<double[]> entry: kms) { + double km = entry.getKm(); + double[] devArray = entry.getValue(); + if (devArray == null) { + continue; + } + double dev = devArray[0]; + double up = dev; + double lo = -dev; + upper.add(km, up); + lower.add(km, lo); + } + area.addSeries(upper); + area.addSeries(lower); + + Marker marker = new ValueMarker(0); + marker.setStroke(new BasicStroke(2)); + marker.setPaint(Color.BLACK); + addValueMarker(marker); + addAreaSeries(area, 0, visible); + } + + protected void doAnalysisEventsOut( + ArtifactAndFacet aaf, + Document doc, + boolean visible) + { + logger.debug("doAnalysisEventsOut"); + int index = aaf.getFacet().getIndex(); + int sectorNdx = index & 3; + int periodNdx = index >> 2; + + KMIndex<AnalysisPeriod[]> kms = + (KMIndex<AnalysisPeriod[]>)aaf.getData(context); + + if(kms == null) { + return; + } + + XYSeriesCollection col = new XYSeriesCollection(); + + List<StyledXYSeries> series = new ArrayList<StyledXYSeries>(); + + for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) { + double km = entry.getKm(); + AnalysisPeriod[] ap = entry.getValue(); + QWD[] qwds = ap[periodNdx].getQWDs(); + + String space = ""; + for (int i = 0; i < qwds.length; i++) { + if (series.size() <= i && qwds.length > i) { + StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc); + series.add (s); + } + StyledXYSeries s = series.get(i); + s.add(km, qwds[i].getDeltaW()); + space+= " "; + } + } + for (StyledXYSeries s: series) { + col.addSeries(s); + } + + addAxisDataset(col, 0, visible); + } + + protected void doReferenceEventsOut( + ArtifactAndFacet aaf, + Document doc, + boolean visible) + { + logger.debug("doReferenceEventOut"); + + KMIndex<QWD[]> kms = + (KMIndex<QWD[]>)aaf.getData(context); + + if(kms == null) { + return; + } + + XYSeriesCollection col = new XYSeriesCollection(); + + List<StyledXYSeries> series = new ArrayList<StyledXYSeries>(); + + for (KMIndex.Entry<QWD[]> entry: kms) { + double km = entry.getKm(); + QWD[] qwds = entry.getValue(); + + String space = ""; + for (int i = 0; i < qwds.length; i++) { + if (series.size() <= i && qwds.length > i) { + StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc); + series.add (s); + } + StyledXYSeries s = series.get(i); + s.add(km, qwds[i].getDeltaW()); + space += " "; + } + } + for (StyledXYSeries s: series) { + col.addSeries(s); + } + + addAxisDataset(col, 0, visible); + } + + + @Override + protected String getDefaultChartTitle() { + return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); + } + + @Override + protected String getDefaultXAxisLabel() { + return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); + } + + @Override + protected String getDefaultYAxisLabel(int pos) { + return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); + } + + @Override + protected ChartGenerator.YAxisWalker getYAxisWalker() { + return new YAxisWalker() { + @Override + public int length() { + return YAXIS.values().length; + } + + @Override + public String getId(int idx) { + YAXIS[] yaxes = YAXIS.values(); + return yaxes[idx].toString(); + } + }; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :