001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/portal/standard/wms/control/ScaleBarSwitcherListener.java $
002: /*---------------- FILE HEADER ------------------------------------------
003:
004: This file is part of deegree.
005: Copyright (C) 2001-2008 by:
006: EXSE, Department of Geography, University of Bonn
007: http://www.giub.uni-bonn.de/deegree/
008: lat/lon GmbH
009: http://www.lat-lon.de
010:
011: This library is free software; you can redistribute it and/or
012: modify it under the terms of the GNU Lesser General Public
013: License as published by the Free Software Foundation; either
014: version 2.1 of the License, or (at your option) any later version.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: Contact:
026:
027: Andreas Poth
028: lat/lon GmbH
029: Aennchenstr. 19
030: 53115 Bonn
031: Germany
032: E-Mail: poth@lat-lon.de
033:
034: Prof. Dr. Klaus Greve
035: Department of Geography
036: University of Bonn
037: Meckenheimer Allee 166
038: 53115 Bonn
039: Germany
040: E-Mail: greve@giub.uni-bonn.de
041:
042:
043: ---------------------------------------------------------------------------*/
044: package org.deegree.portal.standard.wms.control;
045:
046: import javax.servlet.ServletRequest;
047:
048: import org.deegree.enterprise.control.FormEvent;
049: import org.deegree.enterprise.control.RPCMethodCall;
050: import org.deegree.enterprise.control.RPCParameter;
051: import org.deegree.enterprise.control.RPCStruct;
052: import org.deegree.enterprise.control.RPCWebEvent;
053: import org.deegree.framework.log.ILogger;
054: import org.deegree.framework.log.LoggerFactory;
055: import org.deegree.framework.util.MapUtils;
056: import org.deegree.model.crs.CRSFactory;
057: import org.deegree.model.crs.CoordinateSystem;
058: import org.deegree.model.crs.GeoTransformer;
059: import org.deegree.model.crs.UnknownCRSException;
060: import org.deegree.model.spatialschema.Envelope;
061: import org.deegree.model.spatialschema.GeometryFactory;
062: import org.deegree.portal.Constants;
063:
064: /**
065: * The ScaleSwitcherListner handles switching the scalebar values from igeoportal
066: *
067: * @author <a href="mailto:ncho@lat-lon.de">Serge N'Cho</a>
068: * @author last edited by: $$Author: rbezema $$
069: *
070: * @version $$Revision: 9458 $$, $$Date: 2008-01-08 03:04:46 -0800 (Tue, 08 Jan 2008) $$
071: */
072:
073: public class ScaleBarSwitcherListener extends AbstractMapListener {
074:
075: private static final ILogger LOG = LoggerFactory
076: .getLogger(ScaleBarSwitcherListener.class);
077:
078: /**
079: * Comment for "unit"
080: */
081: public static final String UNIT = "unit";
082:
083: /**
084: * Comment for "taskFromListener"
085: */
086: public static final String TASK_FROM_LISTENER = "taskFromListener";
087:
088: /**
089: * Comment for "scaleBarValue"
090: */
091: public static final String SCALE_BAR_VALUE = "scaleBarValue";
092:
093: /**
094: * Comment for "newScaleBarValue"
095: */
096: public static final String NEW_SCALE_BAR_VALUE = "newScaleBarValue";
097:
098: /**
099: * Comment for "BBOX"
100: */
101: public static final String BBOX = "BBOX";
102:
103: /**
104: * Comment for "newBBox"
105: */
106: public static final String NEW_BBOX = "newBBox";
107:
108: /**
109: * Constant for "crs"
110: */
111: private static final String CRS = "crs";
112:
113: /**
114: * Constant for "taskFromJSObject"
115: */
116: private static final String JS_TAK = "taskFromJSObject";
117:
118: /**
119: * Constant for "requestedBarValue"
120: */
121: private static final String REQUESTED_BAR_VALUE = "requestedBarValue";
122:
123: /**
124: * Constant for "getNewBBOX"
125: */
126: private static final String GET_NEW_BBOX = "getNewBBOX";
127:
128: /**
129: * Constant for "getActualScaleBarValue"
130: */
131: private static final String GET_ACTUAL_BAR_VAULE = "getActualScaleBarValue";
132:
133: /*
134: * (non-Javadoc)
135: *
136: * @see org.deegree.enterprise
137: * .control.WebListener#actionPerformed(org.deegree.enterprise.control.FormEvent)
138: */
139: public void actionPerformed(FormEvent event) {
140:
141: RPCWebEvent rpc = (RPCWebEvent) event;
142: RPCMethodCall mc = rpc.getRPCMethodCall();
143: RPCParameter param = mc.getParameters()[0];
144: RPCStruct struct = (RPCStruct) param.getValue();
145: double minx = (Double) struct.getMember(Constants.RPC_BBOXMINX)
146: .getValue();
147: double miny = (Double) struct.getMember(Constants.RPC_BBOXMINY)
148: .getValue();
149: double maxx = (Double) struct.getMember(Constants.RPC_BBOXMAXX)
150: .getValue();
151: double maxy = (Double) struct.getMember(Constants.RPC_BBOXMAXY)
152: .getValue();
153: String crsString = struct.getMember(CRS).getValue().toString();
154: CoordinateSystem crs;
155: try {
156: crs = CRSFactory.create(crsString);
157: } catch (UnknownCRSException e) {
158: gotoErrorPage(e.getMessage());
159: return;
160: }
161: Envelope inBBOX = GeometryFactory.createEnvelope(minx, miny,
162: maxx, maxy, crs);
163: String unit = struct.getMember(UNIT).getValue().toString();
164: String taskFromJSObject = struct.getMember(JS_TAK).getValue()
165: .toString();
166: double actualBarValue = calculateScaleBarValue(inBBOX);
167:
168: if (!"m".equalsIgnoreCase(unit)) {
169: actualBarValue = convertToUnit(actualBarValue, unit);
170: }
171:
172: ServletRequest request = this .getRequest();
173:
174: if (GET_ACTUAL_BAR_VAULE.equalsIgnoreCase(taskFromJSObject)) {
175: request.setAttribute(TASK_FROM_LISTENER,
176: NEW_SCALE_BAR_VALUE);
177: request.setAttribute(SCALE_BAR_VALUE, Double
178: .valueOf(actualBarValue));
179: } else if (GET_NEW_BBOX.equals(taskFromJSObject)) {
180:
181: Double requestedBarValue = (Double) struct.getMember(
182: REQUESTED_BAR_VALUE).getValue();
183:
184: Envelope newBBox = MapUtils.scaleEnvelope(inBBOX,
185: actualBarValue, requestedBarValue);
186:
187: double[] bbox = { newBBox.getMin().getX(),
188: newBBox.getMin().getY(), newBBox.getMax().getX(),
189: newBBox.getMax().getY() };
190:
191: request.setAttribute(TASK_FROM_LISTENER, NEW_BBOX);
192: request.setAttribute(BBOX, bbox);
193: request.setAttribute(SCALE_BAR_VALUE, requestedBarValue);
194:
195: }
196:
197: request.setAttribute(UNIT, unit);
198:
199: }
200:
201: /**
202: * The methode <code>calculateScaleBarValue</code> calculates the scaleBarValue of the Map.
203: *
204: * @param bbox
205: * the actual Envelope of the map
206: * @param mapWidth
207: * @param mapHeight
208: * @return - The distance from <code>bbox</code>.minx to <code>.maxx in meters
209: */
210: private double calculateScaleBarValue(Envelope bbox) {
211:
212: double scaleBarValue = 0;
213:
214: try {
215: // Convert BBox to EPSG:4326 bevor calculating the scalBarValue
216: if (!"EPSG:4326".equalsIgnoreCase(bbox
217: .getCoordinateSystem().getName())) {
218:
219: GeoTransformer transformer = new GeoTransformer(
220: "EPSG:4326");
221: bbox = transformer.transform(bbox, bbox
222: .getCoordinateSystem());
223:
224: }
225:
226: scaleBarValue = MapUtils.calcDistance(bbox.getMin().getX(),
227: bbox.getMin().getY(), bbox.getMax().getX(), bbox
228: .getMin().getY());
229: } catch (Exception e) {
230: e.printStackTrace();
231: }
232:
233: return scaleBarValue;
234: }
235:
236: /**
237: * The methode converts the length -actualValue- to unit
238: *
239: * @param actualValue -
240: * The length to be converted
241: * @param unit -
242: * The unit in which the length is to converted to
243: * @return - The converted length to unit
244: */
245: private double convertToUnit(double actualValue, String unit) {
246:
247: if ("km".equalsIgnoreCase(unit)) {
248: return actualValue * 0.001;
249: }
250: // FIXME to which unit should this be extended to
251:
252: return actualValue;
253: }
254:
255: }
|