001 // $HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/framework/xml/MinMaxExtractor.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.framework.xml;
037
038 import org.deegree.model.spatialschema.Envelope;
039 import org.deegree.model.spatialschema.GMLGeometryAdapter;
040 import org.deegree.model.spatialschema.Geometry;
041 import org.deegree.model.spatialschema.GeometryException;
042 import org.deegree.model.spatialschema.Point;
043 import org.deegree.model.spatialschema.Position;
044 import org.w3c.dom.Element;
045 import org.w3c.dom.Node;
046
047 /**
048 * Provides methods to XSLT-Sheets that determine the min/max coordinates of a gml geometry.
049 * <p>
050 * The submitted node parameter must be set to the root node of the geometry.
051 *
052 * @version $Revision: 18195 $
053 * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a>
054 * @author last edited by: $Author: mschneider $
055 *
056 * @version 1.0. $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
057 *
058 * @since 2.0
059 */
060 public class MinMaxExtractor {
061
062 /**
063 *
064 * @param node
065 * @return maximum x coordinate
066 * @throws GeometryException
067 */
068 public static String getXMax( Node node )
069 throws GeometryException {
070 if ( node == null ) {
071 return "";
072 }
073 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
074 Envelope envelope = geometry.getEnvelope();
075 return Double.toString( envelope.getMax().getX() );
076 }
077
078 /**
079 *
080 * @param node
081 * @return minimum x coordinate
082 * @throws GeometryException
083 */
084 public static String getXMin( Node node )
085 throws GeometryException {
086 if ( node == null ) {
087 return "";
088 }
089 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
090 Envelope envelope = geometry.getEnvelope();
091 return Double.toString( envelope.getMin().getX() );
092 }
093
094 /**
095 *
096 * @param node
097 * @return maximum y coordinate
098 * @throws GeometryException
099 */
100 public static String getYMax( Node node )
101 throws GeometryException {
102 if ( node == null ) {
103 return "";
104 }
105 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
106 Envelope envelope = geometry.getEnvelope();
107 return Double.toString( envelope.getMax().getY() );
108 }
109
110 /**
111 *
112 * @param node
113 * @return minimum y coordinate
114 * @throws GeometryException
115 */
116 public static String getYMin( Node node )
117 throws GeometryException {
118 if ( node == null ) {
119 return "";
120 }
121 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
122 Envelope envelope = geometry.getEnvelope();
123 return Double.toString( envelope.getMin().getY() );
124 }
125
126 /**
127 *
128 * @param node
129 * @return maximum z coordinate
130 * @throws GeometryException
131 */
132 public static String getZMin( Node node )
133 throws GeometryException {
134 if ( node == null ) {
135 return "";
136 }
137 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
138 Envelope envelope = geometry.getEnvelope();
139 if ( geometry.getCoordinateDimension() > 2 ) {
140 return "";
141 }
142 return Double.toString( envelope.getMin().getZ() );
143 }
144
145 /**
146 *
147 * @param node
148 * @return minimum z coordinate
149 * @throws GeometryException
150 */
151 public static String getZMax( Node node )
152 throws GeometryException {
153 if ( node == null ) {
154 return "";
155 }
156 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
157 Envelope envelope = geometry.getEnvelope();
158 if ( geometry.getCoordinateDimension() > 2 ) {
159 return "";
160 }
161 return Double.toString( envelope.getMax().getZ() );
162
163 }
164
165 /**
166 * Extracts the x value of a gml:Point element described by <code>pointNode</code>
167 *
168 * @param pointNode
169 * the point node from which the x value will be extracted. For example, node is
170 * <gml:Point srsName="EPSG:31466"> <gml:coordinates cs="," decimal="." ts="
171 * ">0.0,0.0</gml:coordinates> </gml:Point>
172 * @return the String representation of the x value
173 * @throws GeometryException
174 */
175 public static String getPointX( Node pointNode )
176 throws GeometryException {
177 return getPointXorY( pointNode, 0 );
178 }
179
180 /**
181 * Extracts the y value of a gml:Point element described by <code>pointNode</code>
182 *
183 * @param pointNode
184 * the point node from which the y value will be extracted. For example, node is
185 * <gml:Point srsName="EPSG:31466"> <gml:coordinates cs="," decimal="." ts="
186 * ">0.0,0.0</gml:coordinates> </gml:Point>
187 * @return the String representation of the y value
188 * @throws GeometryException
189 */
190 public static String getPointY( Node pointNode )
191 throws GeometryException {
192 return getPointXorY( pointNode, 1 );
193 }
194
195 /**
196 *
197 * @param pointNode
198 * the point node from which the x or y value will be extracted. For example, node is
199 * <gml:Point srsName="EPSG:31466"> <gml:coordinates cs="," decimal="." ts="
200 * ">0.0,0.0</gml:coordinates> </gml:Point>
201 * @param coordIndex
202 * the coordenate index indicated whether to extract from x (index = 0) otherwise
203 * from y
204 * @return the String representation of the x or y value
205 * @throws GeometryException
206 */
207 private static String getPointXorY( Node pointNode, int coordIndex )
208 throws GeometryException {
209 String value = "";
210
211 if ( pointNode != null ) {
212
213 Geometry geometry = GMLGeometryAdapter.wrap( (Element) pointNode, null );
214 if ( geometry instanceof Point ) {
215 Point p = (Point) geometry;
216 double d = coordIndex == 0 ? p.getX() : p.getY();
217 value = Double.toString( d );
218 }
219 }
220
221 return value;
222
223 }
224
225 /**
226 * returns the minimum coordinate of the envelope of the geometry encoded by the passed node as
227 * a double array
228 *
229 * @param node
230 * @return the minimum coordinate of the envelope of the geometry encoded by the passed node as
231 * a double array
232 * @throws GeometryException
233 */
234 public static String getMinAsArray( Node node )
235 throws GeometryException {
236 if ( node == null ) {
237 return "";
238 }
239 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
240 if ( geometry instanceof Point ) {
241 return "";
242 }
243 Envelope env = geometry.getEnvelope();
244 StringBuffer sb = new StringBuffer( 100 );
245
246 Position pos = env.getMin();
247 int dim = pos.getCoordinateDimension();
248 double[] d = pos.getAsArray();
249 for ( int i = 0; i < dim - 1; i++ ) {
250 sb.append( Double.toString( d[i] ) ).append( ' ' );
251 }
252 sb.append( Double.toString( d[dim - 1] ) );
253
254 return sb.toString();
255 }
256
257 /**
258 * returns the minimum coordinate of the envelope of the geometry encoded by the passed node as
259 * a double array
260 *
261 * @param node
262 * @return the minimum coordinate of the envelope of the geometry encoded by the passed node as
263 * a double array
264 * @throws GeometryException
265 */
266 public static String getMaxAsArray( Node node )
267 throws GeometryException {
268 if ( node == null ) {
269 return "";
270 }
271 Geometry geometry = GMLGeometryAdapter.wrap( (Element) node, null );
272 if ( geometry instanceof Point ) {
273 return "";
274 }
275 Envelope env = geometry.getEnvelope();
276 StringBuffer sb = new StringBuffer( 100 );
277
278 Position pos = env.getMax();
279 int dim = pos.getCoordinateDimension();
280 double[] d = pos.getAsArray();
281 for ( int i = 0; i < dim - 1; i++ ) {
282 sb.append( Double.toString( d[i] ) ).append( ' ' );
283 }
284 sb.append( Double.toString( d[dim - 1] ) );
285
286 return sb.toString();
287 }
288
289 /**
290 * returns the the name of the SRS of the geometry encoded by the passed node as a double array
291 *
292 * @param node
293 * @return the the name of the SRS of the geometry.
294 */
295 public static String getSRSName( Node node ) {
296 if ( node == null ) {
297 return "";
298 }
299 return ( (Element) node ).getAttribute( "srsName" );
300 }
301
302 }