# HG changeset patch # User Ingo Weinzierl # Date 1271674525 0 # Node ID 43f3c0cd60f2237694affe0218ded3a7c418df18 # Parent 05bf8534a35a575109fc261b96c2a58936277772 First implementation of an odv export of a 'Profilschnitt' (issue217). gnv-artifacts/trunk@944 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 05bf8534a35a -r 43f3c0cd60f2 gnv-artifacts/ChangeLog --- a/gnv-artifacts/ChangeLog Sun Apr 18 09:17:25 2010 +0000 +++ b/gnv-artifacts/ChangeLog Mon Apr 19 10:55:25 2010 +0000 @@ -1,3 +1,24 @@ +2010-04-19 Ingo Weinzierl + + Issue217 + + * doc/conf/products/verticalcrosssection/conf_mesh.xml: Added odv as + possible export format. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Collect the necessary data for an odv export and trigger + VerticalCrossODVExport that writes this data as odv to an output stream. + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: Store + coordinates for each colum in a class variable. + + * src/main/java/de/intevation/gnv/exports/VerticalCrossODVExport.java: + Write data used in 'Profilschnitten' to an odv file. + + TODO: The implementation is not finished yet. There are no cruises and + stations for 'Profilschnitte', so we need to clarify if this columns can + be skipped. + 2010-04-18 Sascha L. Teichmann * src/main/java/de/intevation/gnv/**/*.java: diff -r 05bf8534a35a -r 43f3c0cd60f2 gnv-artifacts/doc/conf/products/verticalcrosssection/conf_mesh.xml --- a/gnv-artifacts/doc/conf/products/verticalcrosssection/conf_mesh.xml Sun Apr 18 09:17:25 2010 +0000 +++ b/gnv-artifacts/doc/conf/products/verticalcrosssection/conf_mesh.xml Mon Apr 19 10:55:25 2010 +0000 @@ -249,6 +249,7 @@ + diff -r 05bf8534a35a -r 43f3c0cd60f2 gnv-artifacts/src/main/java/de/intevation/gnv/exports/VerticalCrossODVExport.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/VerticalCrossODVExport.java Mon Apr 19 10:55:25 2010 +0000 @@ -0,0 +1,202 @@ +package de.intevation.gnv.exports; + +import com.vividsolutions.jts.geom.Coordinate; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.log4j.Logger; + +import au.com.bytecode.opencsv.CSVWriter; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.math.Interpolation3D; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.state.exception.StateException; + + +public class VerticalCrossODVExport implements Export { + + /** + * Constant field which defines the source format of a given datetime. + */ + public static final String SRC_FORMAT = "yyyy.MM.dd HH:mm:ss"; + + /** + * Constant field which defines the target format of a given datetime. + */ + public static final String DEST_FORMAT = "yyyy-MM-dd HH:mm"; + + /** + * Source format. + */ + public static DateFormat srcFormat = new SimpleDateFormat(SRC_FORMAT); + + /** + * Target format. + */ + public static DateFormat destFormat = new SimpleDateFormat(DEST_FORMAT); + + /** + * Logger used for logging via log4j. + */ + private static Logger logger = + Logger.getLogger(VerticalCrossODVExport.class); + + /** + * The path in coordinates. + */ + protected Coordinate[] coordinates; + + /** + * + */ + protected double cellHeight; + + /** + * The raster array storing the values for a specific coordinate in a + * specific depth. + */ + protected double[] raster; + + /** + * The raster width. + */ + protected int width; + + /** + * The raster height. + */ + protected int height; + + /** + * The date of this export. + */ + protected String time; + + /** + * The constructor used to create a new export helper object. + */ + public VerticalCrossODVExport( + Coordinate[] coordinates, + double cellHeight, + double[] raster, + String time, + int width, + int height) + { + this.coordinates = coordinates; + this.cellHeight = cellHeight; + this.raster = raster; + this.width = width; + this.height = height; + this.time = time; + } + + + /** + * + * @param profile The Profile used to create column headers. + * @param outputStream The stream where the odv data are written to. + * @param result Not used here, might be null. + */ + public void create( + Profile profile, + OutputStream outputStream, + Collection result) + throws + IOException, + UnsupportedEncodingException, + StateException + { + CSVWriter writer = new CSVWriter( + new OutputStreamWriter(outputStream, profile.getEncoding()), + profile.getSeparator(), + profile.getQuoteCharacter(), + profile.getEscapeCharacter()); + + writer.writeNext(profile.getHeader()); + + writeData(writer, time, coordinates, cellHeight, raster); + + writer.close(); + } + + protected void writeData( + CSVWriter writer, + String time, + Coordinate[] coordinates, + double cellHeight, + double[] raster) + { + if (logger.isDebugEnabled()) { + logger.debug("+++++++ ODV Export information ++++++++++"); + logger.debug("+ raster width: " + width); + logger.debug("+ raster height: " + height); + logger.debug("+ items in raster: " + raster.length); + logger.debug("+ number of coordinates: " + coordinates.length); + logger.debug("+++++++++++++++++++++++++++++++++++++++++"); + } + + String datetime = null; + try { + Date tmp = srcFormat.parse(time); + datetime = destFormat.format(tmp); + } + catch (ParseException pe) { + logger.error(pe, pe); + } + + String[] row = new String[10]; + for (int i = 0; i < width; i++) { + row[0] = "Station_" + i; + //row[0] = ""; + row[1] = ""; + row[2] = "*"; + row[3] = datetime; + row[4] = Double.toString(coordinates[i].x); + row[5] = Double.toString(coordinates[i].y); + row[6] = "0"; + + for (int j = 0; j < height; j++) { + if (j == 1) { + row[0] = ""; + //row[0] = "Station_"; + row[1] = ""; + row[2] = ""; + row[3] = ""; + row[4] = ""; + row[5] = ""; + row[6] = ""; + } + + // row[2] = Double.toString(depths[j]); + // + row[7] = Double.toString(j * cellHeight + cellHeight / 2d); + row[8] = "1"; + double value = raster[i+(j*height)]; + + if (Double.isNaN(value)) { + break; + } + + row[9] = Double.toString(value); + + writer.writeNext(row); + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 05bf8534a35a -r 43f3c0cd60f2 gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation3D.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation3D.java Sun Apr 18 09:17:25 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation3D.java Mon Apr 19 10:55:25 2010 +0000 @@ -61,6 +61,11 @@ protected double cellHeight; /** + * The coordinates of the interpolation. + */ + protected Coordinate[] coordinates; + + /** * The generated raster. */ protected double [] raster; @@ -128,6 +133,14 @@ } /** + * Returns the coordinates used for the interpolation. + * @return the coordinates used for the interpolation. + */ + public Coordinate[] getCoordinates() { + return coordinates; + } + + /** * Returns the generated raster. * @return The generated raster. */ @@ -212,6 +225,8 @@ double [] depths = new double[width]; Arrays.fill(depths, Double.NaN); + Coordinate[] coordinates = new Coordinate[width]; + double cellWidth = (to - from)/width; double maxDepth = Double.MAX_VALUE; @@ -220,6 +235,7 @@ Coordinate center = new Coordinate(); for (double p = cellWidth*0.5; i < depths.length; ++i, p += cellWidth) { if (linearToMap.locate(p, center)) { + coordinates[i] = (Coordinate) center.clone(); double depth = xyDepth.depth(center); depths[i] = depth; if (depth < maxDepth) { @@ -315,10 +331,11 @@ } // down the x/y column } // all along the track - this.depths = depths; - this.raster = raster; - this.cellWidth = cellWidth; - this.cellHeight = cellHeight; + this.coordinates = coordinates; + this.depths = depths; + this.raster = raster; + this.cellWidth = cellWidth; + this.cellHeight = cellHeight; return true; } diff -r 05bf8534a35a -r 43f3c0cd60f2 gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Sun Apr 18 09:17:25 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Mon Apr 19 10:55:25 2010 +0000 @@ -1,5 +1,7 @@ package de.intevation.gnv.state.profile.verticalcrosssection; +import au.com.bytecode.opencsv.CSVWriter; + import java.awt.Color; import java.awt.Dimension; import java.awt.Paint; @@ -30,6 +32,9 @@ import de.intevation.gnv.chart.Chart; import de.intevation.gnv.chart.ChartLabels; import de.intevation.gnv.chart.VerticalCrossSectionChart; +import de.intevation.gnv.exports.DefaultProfile; +import de.intevation.gnv.exports.Export; +import de.intevation.gnv.exports.VerticalCrossODVExport; import de.intevation.gnv.geobackend.base.Result; import de.intevation.gnv.geobackend.base.ResultDescriptor; import de.intevation.gnv.geobackend.base.query.QueryExecutor; @@ -668,13 +673,66 @@ } @Override - protected void createODV(OutputStream outputStream, String uuid, - CallContext callContext) throws IOException, - StateException { - Object chartResult = this.getChartResult(uuid, callContext); - log.debug("Hier gehts weiter"); + protected void createODV( + OutputStream outputStream, + String uuid, + CallContext callContext) + throws IOException, StateException + { + // 'Profilschnitte' contain one parameter only + Collection tmp = getParameters(uuid); + KeyValueDescibeData param = (KeyValueDescibeData) tmp.toArray()[0]; + + String [] COLUMN_HEADER = { + "Cruise", + "Station", + "Type", + "yyyy-mm-dd hh:mm", + "Lon (°E)", + "Lat (°N)", + "Bot. Depth [m]", + "Depth [m]", + "QF", + param.getValue() + }; + + Export.Profile ODV_PROFILE = new DefaultProfile( + COLUMN_HEADER, + '\t', + CSVWriter.NO_QUOTE_CHARACTER, + CSVWriter.NO_ESCAPE_CHARACTER, + "ODV", + "ISO-8859-1"); + + Object chartResult = getChartResult(uuid, callContext); + + if (chartResult == null) { + log.error("No data for export found."); + return; + } + + List result = new ArrayList(1); + result.add(chartResult); + + InputData data = inputData.get(dateValueName); + String date = data.getDescription()[0]; + + Interpolation3D interpol = ((AttributedXYColumns) + chartResult).getInterpolation(); + + Coordinate[] coords = interpol.getCoordinates(); + double[] depth = interpol.getDepths(); + double[] raster = interpol.getRaster(); + + Export export = new VerticalCrossODVExport( + interpol.getCoordinates(), + interpol.getCellHeight(), + interpol.getRaster(), + date, + interpol.getWidth(), + interpol.getHeight()); + + export.create(ODV_PROFILE, outputStream, null); } - - } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :