view 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 source
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 :

http://dive4elements.wald.intevation.org