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