Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/exports/minfo/SedimentLoadExporter.java @ 7691:fa4fbd66e752
(issue1579) Fix axes syncronisation at Gauges
The SyncNumberAxis was completely broken. It only synced
in one direction and even that did not work correctly when
data was added to the axis (and the syncAxis rescaled but
forgot the old axis) then there were lots of ways to bypass
that scaling. And i also think the trans calculation was wrong.
It has been replaced by a "mostly" simple method to just keep
the W in M and W in CM+Datum axes in sync. I say "Mostly" because
it had to deal with the Bounds interface.
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 13 Dec 2013 19:03:00 +0100 |
parents | 0426c1efd680 |
children | 963ede7b32bb |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde * Software engineering by Intevation GmbH * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.exports.minfo; import java.util.LinkedList; import java.util.List; import java.util.TreeSet; import java.io.OutputStream; import java.io.IOException; import java.text.NumberFormat; import org.apache.log4j.Logger; import org.dive4elements.river.artifacts.access.SedimentLoadAccess; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.minfo.SedimentLoad; import org.dive4elements.river.artifacts.model.minfo.SedimentLoadFraction; import org.dive4elements.river.artifacts.model.minfo.SedimentLoadResult; import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.exports.AbstractExporter; import org.dive4elements.river.utils.Formatter; import au.com.bytecode.opencsv.CSVWriter; /** * Do CSV export for sediment load calculations (will also be shown in * client). */ public class SedimentLoadExporter extends AbstractExporter { /** Private logger. */ private static Logger logger = Logger.getLogger(SedimentLoadExporter.class); // i18n keys. public static final String CSV_KM = "export.sedimentload_ls.csv.header.km"; public static final String CSV_YEAR = "export.sedimentload_ls.csv.header.year"; public static final String CSV_COARSE = "export.sedimentload_ls.csv.header.coarse"; public static final String CSV_FINEMIDDLE = "export.sedimentload_ls.csv.header.finemiddle"; public static final String CSV_SAND = "export.sedimentload_ls.csv.header.sand"; public static final String CSV_SUSP_SAND = "export.sedimentload_ls.csv.header.suspsand"; public static final String CSV_SUSP_SAND_BB = "export.sedimentload_ls.csv.header.suspsandbb"; public static final String CSV_SUSP_SEDIMENT = "export.sedimentload_ls.csv.header.suspsediment"; public static final String CSV_TOTAL = "export.sedimentload_ls.csv.header.total"; /** Collected results. */ private SedimentLoadResult[] results; /** Empty constructor. */ public SedimentLoadExporter() { results = new SedimentLoadResult[0]; } /** Process all stored data and write csv. */ @Override protected void writeCSVData(CSVWriter writer) throws IOException { writeCSVHeader(writer); for (SedimentLoadResult result: results) { String years = (result.getEndYear() == 0) ? result.getStartYear() + " " : result.getStartYear() + "-" + result.getEndYear(); SedimentLoad load = result.getLoad(); // Put load.getName()+load.getDescription()}); somewhere? for (double km: new TreeSet<Double>(load.getKms())) { SedimentLoadFraction fraction = load.getFraction(km); writeRecord(writer, km, years, fraction); } } } /** Return space when val is NaN, apply NumberFormat otherwise. */ private String numberToString(NumberFormat valf, double val) { if (Double.isNaN(val)) { return " "; } return valf.format(val); } /** Return space when val is NaN or zero, apply NumberFormat otherwise. */ private String nonZeroToString(NumberFormat valf, double val) { if (Double.isNaN(val) || val == 0d) { return " "; } return valf.format(val); } /** Write a line. */ private void writeRecord( CSVWriter writer, double km, String years, SedimentLoadFraction fraction ) { // year, total, susp sed, susp sandbed suspsand, sand, finemiddle, coarse NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); NumberFormat valf = Formatter.getFormatter(context.getMeta(), 0, 2); writer.writeNext(new String[] { kmf.format(km), years, numberToString(valf, fraction.getSuspSediment()), numberToString(valf, fraction.getSuspSand()), numberToString(valf, fraction.getSuspSandBed()), numberToString(valf, fraction.getSand()), numberToString(valf, fraction.getFineMiddle()), numberToString(valf, fraction.getCoarse()), nonZeroToString(valf, fraction.getTotal()) }); } /** Writes i18ned header for csv file/stream. */ protected void writeCSVHeader(CSVWriter writer) { logger.debug("writeCSVHeader()"); List<String> header = new LinkedList<String>(); if (results != null) { SedimentLoadAccess access = new SedimentLoadAccess((D4EArtifact) master); String unit = " [" + msg("state.minfo." + access.getUnit(), "translation missing") + "]"; header.add(msg(CSV_KM, "km")); header.add(msg(CSV_YEAR, "Jahr")); header.add(msg(CSV_SUSP_SEDIMENT, "Schwebst.") + unit); header.add(msg(CSV_SUSP_SAND, "Susp.Sand") + unit); header.add(msg(CSV_SUSP_SAND_BB, "Susp.Sand(BB)") + unit); header.add(msg(CSV_SAND, "Sand") + unit); header.add(msg(CSV_FINEMIDDLE, "Kies(f+m)") + unit); header.add(msg(CSV_COARSE, "Kies(g)") + unit); header.add(msg(CSV_TOTAL, "Gesamt") + unit); } writer.writeNext(header.toArray(new String[header.size()])); } /** Store data internally, accepting only SedimentLoadResults[] in * calculationresults data. */ @Override protected void addData(Object data) { if (!(data instanceof CalculationResult)) { logger.warn("Invalid data type."); return; } Object[] d = (Object[])((CalculationResult)data).getData(); if (!(d instanceof SedimentLoadResult[])) { logger.warn("Invalid result object."); return; } logger.debug("addData: Data added."); results = (SedimentLoadResult[])d; } /** Write PDF to outputstream (not implemented yet). */ @Override protected void writePDF(OutputStream out) { logger.warn("Not implemented."); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :