comparison flys-artifacts/src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java @ 647:bb484489d3df

Introduced a new output generators for creating chart info documents. flys-artifacts/trunk@2032 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 01 Jun 2011 08:01:07 +0000
parents
children d4c4fefb095b
comparison
equal deleted inserted replaced
646:d299e220d89c 647:bb484489d3df
1 package de.intevation.flys.exports;
2
3 import java.awt.geom.AffineTransform;
4 import java.awt.geom.NoninvertibleTransformException;
5 import java.awt.geom.Rectangle2D;
6
7 import org.w3c.dom.Document;
8 import org.w3c.dom.Element;
9
10 import org.apache.log4j.Logger;
11
12 import org.jfree.chart.ChartRenderingInfo;
13 import org.jfree.chart.JFreeChart;
14 import org.jfree.chart.plot.XYPlot;
15 import org.jfree.data.Range;
16
17 import de.intevation.artifacts.common.ArtifactNamespaceContext;
18 import de.intevation.artifacts.common.utils.XMLUtils;
19 import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
20
21
22 /**
23 * This class helps generating chart info documents.
24 *
25 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
26 */
27 public class InfoGeneratorHelper {
28
29 private static final Logger logger =
30 Logger.getLogger(InfoGeneratorHelper.class);
31
32
33 private InfoGeneratorHelper() {
34 }
35
36
37 /**
38 * Triggers the creation of the chart info document.
39 *
40 * @param chart The JFreeChart chart.
41 * @param info An info object that has been created while chart creation.
42 *
43 * @return the info document.
44 */
45 public static Document createInfoDocument(
46 JFreeChart chart,
47 ChartRenderingInfo info)
48 {
49 logger.debug("InfoGeneratorHelper.createInfoDocument");
50
51 Document doc = XMLUtils.newDocument();
52
53 ElementCreator cr = new ElementCreator(
54 doc,
55 ArtifactNamespaceContext.NAMESPACE_URI,
56 ArtifactNamespaceContext.NAMESPACE_PREFIX);
57
58 Element chartinfo = cr.create("chartinfo");
59
60 chartinfo.appendChild(createTransformationElement(cr, chart, info));
61
62 doc.appendChild(chartinfo);
63
64 return doc;
65 }
66
67
68 /**
69 * This method appends the values of a transformation matrix to transform
70 * image pixel coordinates into chart coordinates.
71 *
72 * @param cr The ElementCreator.
73 * @param chart The chart object.
74 * @param info The ChartRenderingInfo that is filled while chart creation.
75 *
76 * @return an element that contains one or more transformation matrix.
77 */
78 protected static Element createTransformationElement(
79 ElementCreator cr,
80 JFreeChart chart,
81 ChartRenderingInfo info)
82 {
83 logger.debug("InfoGeneratorHelper.createTransformationElement");
84
85 Element tf = cr.create("transformation-matrix");
86
87 Rectangle2D dataArea = info.getPlotInfo().getDataArea();
88
89 XYPlot plot = (XYPlot) chart.getPlot();
90 Range xRange = plot.getDomainAxis().getRange();
91 Range yRange = plot.getRangeAxis().getRange();
92
93 double[] tm = createTransformationMatrix(dataArea, xRange, yRange);
94
95 cr.addAttr(tf, "sx", String.valueOf(tm[0]), true);
96 cr.addAttr(tf, "sy", String.valueOf(tm[1]), true);
97 cr.addAttr(tf, "tx", String.valueOf(tm[2]), true);
98 cr.addAttr(tf, "ty", String.valueOf(tm[3]), true);
99
100 return tf;
101 }
102
103
104 /**
105 * This method determines a transformation matrix to transform pixel
106 * coordinates of the chart image into chart coordinates.
107 *
108 * @param dataArea The rectangle that contains the data points of the chart.
109 * @param xRange The x axis range.
110 * @param yRange The y axis range.
111 *
112 * @return a double array as follows: [sx, sy, tx, ty].
113 */
114 protected static double[] createTransformationMatrix(
115 Rectangle2D dataArea,
116 Range xRange,
117 Range yRange)
118 {
119 double offsetX = dataArea.getX();
120 double width = dataArea.getWidth() - 1;
121 double offsetY = dataArea.getY();
122 double height = dataArea.getHeight();
123
124 double lowerX = xRange.getLowerBound();
125 double upperX = xRange.getUpperBound();
126 double lowerY = yRange.getLowerBound();
127 double upperY = yRange.getUpperBound();
128
129 double dMoveX = upperX - lowerX;
130 double fMoveX = width * lowerX;
131 double dMoveY = lowerY - upperY;
132 double fMoveY = height * upperY;
133
134 AffineTransform t1 = AffineTransform.getTranslateInstance(
135 offsetX - ( fMoveX / dMoveX ),
136 offsetY - ( fMoveY / dMoveY ) );
137
138 AffineTransform t2 = AffineTransform.getScaleInstance(
139 width / (upperX - lowerX),
140 height / (lowerY - upperY));
141
142 t1.concatenate(t2);
143
144 try {
145 t1.invert();
146
147 double[] c = new double[6];
148 t1.getMatrix(c);
149
150 return new double[] { c[0], c[3], c[4], c[5] };
151 }
152 catch (NoninvertibleTransformException e) {
153 // do nothing
154 logger.warn("Matrix is not invertible.");
155 }
156
157 return new double[] { 1d, 1d, 0d, 0d };
158 }
159 }
160 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org