001 // $HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/framework/xml/MinMaxExtractor.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 Aennchenstraße 19
030 53177 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 package org.deegree.framework.xml;
044
045 import org.deegree.model.spatialschema.Envelope;
046 import org.deegree.model.spatialschema.GMLGeometryAdapter;
047 import org.deegree.model.spatialschema.Geometry;
048 import org.deegree.model.spatialschema.GeometryException;
049 import org.deegree.model.spatialschema.Point;
050 import org.deegree.model.spatialschema.Position;
051 import org.w3c.dom.Element;
052 import org.w3c.dom.Node;
053
054 /**
055 * Provides methods to XSLT-Sheets that determine the min/max coordinates of a gml geometry.
056 * <p>
057 * The submitted node parameter must be set to the root node of the geometry.
058 *
059 * @version $Revision: 9339 $
060 * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a>
061 * @author last edited by: $Author: apoth $
062 *
063 * @version 1.0. $Revision: 9339 $, $Date: 2007-12-27 13:31:52 +0100 (Do, 27 Dez 2007) $
064 *
065 * @since 2.0
066 */
067 public class MinMaxExtractor {
068
069 /**
070 *
071 * @param node
072 * @return maximum x coordinate
073 * @throws GeometryException
074 */
075 public static String getXMax( Node node )
076 throws GeometryException {
077 if ( node == null ) {
078 return "";
079 }
080 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
081 Envelope envelope = geometry.getEnvelope();
082 return Double.toString( envelope.getMax().getX() );
083 }
084
085 /**
086 *
087 * @param node
088 * @return minimum x coordinate
089 * @throws GeometryException
090 */
091 public static String getXMin( Node node )
092 throws GeometryException {
093 if ( node == null ) {
094 return "";
095 }
096 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
097 Envelope envelope = geometry.getEnvelope();
098 return Double.toString( envelope.getMin().getX() );
099 }
100
101 /**
102 *
103 * @param node
104 * @return maximum y coordinate
105 * @throws GeometryException
106 */
107 public static String getYMax( Node node )
108 throws GeometryException {
109 if ( node == null ) {
110 return "";
111 }
112 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
113 Envelope envelope = geometry.getEnvelope();
114 return Double.toString( envelope.getMax().getY() );
115 }
116
117 /**
118 *
119 * @param node
120 * @return minimum y coordinate
121 * @throws GeometryException
122 */
123 public static String getYMin( Node node )
124 throws GeometryException {
125 if ( node == null ) {
126 return "";
127 }
128 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
129 Envelope envelope = geometry.getEnvelope();
130 return Double.toString( envelope.getMin().getY() );
131 }
132
133 /**
134 *
135 * @param node
136 * @return maximum z coordinate
137 * @throws GeometryException
138 */
139 public static String getZMin( Node node )
140 throws GeometryException {
141 if ( node == null ) {
142 return "";
143 }
144 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
145 Envelope envelope = geometry.getEnvelope();
146 if ( geometry.getCoordinateDimension() > 2 ) {
147 return "";
148 }
149 return Double.toString( envelope.getMin().getZ() );
150 }
151
152 /**
153 *
154 * @param node
155 * @return minimum z coordinate
156 * @throws GeometryException
157 */
158 public static String getZMax( Node node )
159 throws GeometryException {
160 if ( node == null ) {
161 return "";
162 }
163 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
164 Envelope envelope = geometry.getEnvelope();
165 if ( geometry.getCoordinateDimension() > 2 ) {
166 return "";
167 }
168 return Double.toString( envelope.getMax().getZ() );
169
170 }
171
172 /**
173 * Extracts the x value of a gml:Point element described by <code>pointNode</code>
174 *
175 * @param pointNode
176 * the point node from which the x value will be extracted. For example, node is
177 * <gml:Point srsName="EPSG:31466"> <gml:coordinates cs="," decimal="." ts="
178 * ">0.0,0.0</gml:coordinates> </gml:Point>
179 * @return the String representation of the x value
180 * @throws GeometryException
181 */
182 public static String getPointX( Node pointNode )
183 throws GeometryException {
184 return getPointXorY( pointNode, 0 );
185 }
186
187 /**
188 * Extracts the y value of a gml:Point element described by <code>pointNode</code>
189 *
190 * @param pointNode
191 * the point node from which the y value will be extracted. For example, node is
192 * <gml:Point srsName="EPSG:31466"> <gml:coordinates cs="," decimal="." ts="
193 * ">0.0,0.0</gml:coordinates> </gml:Point>
194 * @return the String representation of the y value
195 * @throws GeometryException
196 */
197 public static String getPointY( Node pointNode )
198 throws GeometryException {
199 return getPointXorY( pointNode, 1 );
200 }
201
202 /**
203 *
204 * @param pointNode
205 * the point node from which the x or y value will be extracted. For example, node is
206 * <gml:Point srsName="EPSG:31466"> <gml:coordinates cs="," decimal="." ts="
207 * ">0.0,0.0</gml:coordinates> </gml:Point>
208 * @param coordIndex
209 * the coordenate index indicated whether to extract from x (index = 0) otherwise
210 * from y
211 * @return the String representation of the x or y value
212 * @throws GeometryException
213 */
214 private static String getPointXorY( Node pointNode, int coordIndex )
215 throws GeometryException {
216 String value = "";
217
218 if ( pointNode != null ) {
219
220 Geometry geometry = GMLGeometryAdapter.wrap( (Element) pointNode, null );
221 if ( geometry instanceof Point ) {
222 Point p = (Point) geometry;
223 double d = coordIndex == 0 ? p.getX() : p.getY();
224 value = Double.toString( d );
225 }
226 }
227
228 return value;
229
230 }
231
232 /**
233 * returns the minimum coordinate of the envelope of the geometry encoded by the passed node as
234 * a double array
235 *
236 * @param node
237 * @return the minimum coordinate of the envelope of the geometry encoded by the passed node as
238 * a double array
239 * @throws GeometryException
240 */
241 public static String getMinAsArray( Node node )
242 throws GeometryException {
243 if ( node == null ) {
244 return "";
245 }
246 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
247 if ( geometry instanceof Point ) {
248 return "";
249 }
250 Envelope env = geometry.getEnvelope();
251 StringBuffer sb = new StringBuffer( 100 );
252
253 Position pos = env.getMin();
254 int dim = pos.getCoordinateDimension();
255 double[] d = pos.getAsArray();
256 for ( int i = 0; i < dim - 1; i++ ) {
257 sb.append( Double.toString( d[i] ) ).append( ' ' );
258 }
259 sb.append( Double.toString( d[dim - 1] ) );
260
261 return sb.toString();
262 }
263
264 /**
265 * returns the minimum coordinate of the envelope of the geometry encoded by the passed node as
266 * a double array
267 *
268 * @param node
269 * @return the minimum coordinate of the envelope of the geometry encoded by the passed node as
270 * a double array
271 * @throws GeometryException
272 */
273 public static String getMaxAsArray( Node node )
274 throws GeometryException {
275 if ( node == null ) {
276 return "";
277 }
278 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
279 if ( geometry instanceof Point ) {
280 return "";
281 }
282 Envelope env = geometry.getEnvelope();
283 StringBuffer sb = new StringBuffer( 100 );
284
285 Position pos = env.getMax();
286 int dim = pos.getCoordinateDimension();
287 double[] d = pos.getAsArray();
288 for ( int i = 0; i < dim - 1; i++ ) {
289 sb.append( Double.toString( d[i] ) ).append( ' ' );
290 }
291 sb.append( Double.toString( d[dim - 1] ) );
292
293 return sb.toString();
294 }
295
296 /**
297 * returns the the name of the SRS of the geometry encoded by the passed node as a double array
298 *
299 * @param node
300 * @return the the name of the SRS of the geometry encoded by the passed node as a double array
301 * @throws GeometryException
302 */
303 public static String getSRSName( Node node ) {
304 if ( node == null ) {
305 return "";
306 }
307 return ( (Element) node ).getAttribute( "srsName" );
308 }
309
310 }