001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/io/shpapi/shape_new/ShapeEnvelope.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.io.shpapi.shape_new;
037
038 import org.deegree.model.spatialschema.ByteUtils;
039 import org.deegree.model.spatialschema.Envelope;
040 import org.deegree.model.spatialschema.Geometry;
041
042 /**
043 * <code>ShapeEnvelope</code> encapsulates a shapefile envelope.
044 *
045 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
046 * @author last edited by: $Author: mschneider $
047 *
048 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
049 */
050 public class ShapeEnvelope implements Shape {
051
052 /**
053 * The minimum x value.
054 */
055 public double xmin;
056
057 /**
058 * The maximum x value.
059 */
060 public double xmax;
061
062 /**
063 * The minimum y value.
064 */
065 public double ymin;
066
067 /**
068 * The maximum y value.
069 */
070 public double ymax;
071
072 /**
073 * The minimum z value.
074 */
075 public double zmin;
076
077 /**
078 * The maximum z value.
079 */
080 public double zmax;
081
082 /**
083 * The minimum m value.
084 */
085 public double mmin;
086
087 /**
088 * The maximum m value.
089 */
090 public double mmax;
091
092 private boolean isZ, isM;
093
094 /**
095 * Copy constructor. Better to do with clone()?
096 *
097 * @param s
098 */
099 public ShapeEnvelope( ShapeEnvelope s ) {
100 xmin = s.xmin;
101 xmax = s.xmax;
102 ymin = s.ymin;
103 ymax = s.ymax;
104 zmin = s.zmin;
105 zmax = s.zmax;
106 mmin = s.mmin;
107 mmax = s.mmax;
108 isZ = s.isZ;
109 isM = s.isM;
110 }
111
112 /**
113 * Creates a new envelope, with/out z and m dimensions as specified.
114 *
115 * @param z
116 * @param m
117 */
118 public ShapeEnvelope( boolean z, boolean m ) {
119 isZ = z;
120 isM = m;
121 }
122
123 /**
124 * Construct one from deegree Envelope.
125 *
126 * @param env
127 */
128 public ShapeEnvelope( Envelope env ) {
129 xmin = env.getMin().getX();
130 ymin = env.getMin().getY();
131 zmin = env.getMin().getZ();
132 xmax = env.getMax().getX();
133 ymax = env.getMax().getY();
134 zmax = env.getMax().getZ();
135 if ( env.getMin().getCoordinateDimension() == 3 ) {
136 isZ = true;
137 }
138 }
139
140 /**
141 * Extends this envelope to z and m direction.
142 *
143 * @param z_min
144 * @param z_max
145 * @param m_min
146 * @param m_max
147 */
148 public void extend( double z_min, double z_max, double m_min, double m_max ) {
149 this.zmin = z_min;
150 this.zmax = z_max;
151 this.mmin = m_min;
152 this.mmax = m_max;
153
154 isZ = true;
155 }
156
157 /**
158 * Extends this envelope to m direction.
159 *
160 * @param m_min
161 * @param m_max
162 */
163 public void extend( double m_min, double m_max ) {
164 this.mmin = m_min;
165 this.mmax = m_max;
166
167 isM = true;
168 }
169
170 /**
171 * Extends the envelope so the given point fits in.
172 *
173 * @param x
174 * @param y
175 */
176 public void fit( double x, double y ) {
177 xmin = Math.min( x, xmin );
178 xmax = Math.max( x, xmax );
179 ymin = Math.min( y, ymin );
180 ymax = Math.max( y, ymax );
181 }
182
183 /**
184 * Extends the envelope so the given point fits in.
185 *
186 * @param x
187 * @param y
188 * @param z
189 */
190 public void fit( double x, double y, double z ) {
191 fit( x, y );
192 zmin = Math.min( z, zmin );
193 zmax = Math.max( z, zmax );
194 }
195
196 /**
197 * Extends the envelope so the given envelope fits in.
198 *
199 * @param s
200 */
201 public void fit( ShapeEnvelope s ) {
202 if ( s.isZ ) {
203 fit( s.xmin, s.ymin, s.zmin );
204 fit( s.xmax, s.ymax, s.zmax );
205 } else {
206 fit( s.xmin, s.ymin );
207 fit( s.xmax, s.ymax );
208 }
209 }
210
211 /*
212 * (non-Javadoc)
213 *
214 * @see org.deegree.io.shpapi.Shape#getByteLength()
215 */
216 public int getByteLength() {
217 int len = 32;
218 if ( isZ ) {
219 len += 32;
220 }
221 if ( isM ) {
222 len += 16;
223 }
224 return len;
225 }
226
227 /**
228 * Reads only x and y values.
229 *
230 * @see org.deegree.io.shpapi.shape_new.Shape#read(byte[], int)
231 */
232 public int read( byte[] bytes, int offset ) {
233 int off = offset;
234
235 xmin = ByteUtils.readLEDouble( bytes, off );
236 off += 8;
237
238 ymin = ByteUtils.readLEDouble( bytes, off );
239 off += 8;
240
241 xmax = ByteUtils.readLEDouble( bytes, off );
242 off += 8;
243
244 ymax = ByteUtils.readLEDouble( bytes, off );
245 off += 8;
246
247 return off;
248 }
249
250 /**
251 * Writes only x and y values.
252 *
253 * @see org.deegree.io.shpapi.shape_new.Shape#write(byte[], int)
254 */
255 public int write( byte[] bytes, int offset ) {
256 int off = offset;
257
258 ByteUtils.writeLEDouble( bytes, off, xmin );
259 off += 8;
260
261 ByteUtils.writeLEDouble( bytes, off, ymin );
262 off += 8;
263
264 ByteUtils.writeLEDouble( bytes, off, xmax );
265 off += 8;
266
267 ByteUtils.writeLEDouble( bytes, off, ymax );
268 off += 8;
269
270 return off;
271 }
272
273 /**
274 * @return zero, because the envelope does not have a type
275 * @see org.deegree.io.shpapi.shape_new.Shape#getType()
276 */
277 public int getType() {
278 return 0;
279 }
280
281 /**
282 * @return itself, of course
283 * @see org.deegree.io.shpapi.shape_new.Shape#getEnvelope()
284 */
285 public ShapeEnvelope getEnvelope() {
286 return this;
287 }
288
289 @Override
290 public String toString() {
291 StringBuffer sb = new StringBuffer( 200 );
292 sb.append( "x: " ).append( xmin ).append( "/" ).append( xmax );
293 sb.append( ", y: " ).append( ymin ).append( "/" ).append( ymax );
294 if ( isZ ) {
295 sb.append( ", z: " ).append( zmin ).append( "/" ).append( zmax );
296 }
297 if ( isM || isZ ) {
298 sb.append( ", m: " ).append( mmin ).append( "/" ).append( mmax );
299 }
300 return sb.toString();
301 }
302
303 /**
304 * @return null, because an envelope is not a geometry
305 * @see org.deegree.io.shpapi.shape_new.Shape#getGeometry()
306 */
307 public Geometry getGeometry() {
308 return null;
309 }
310
311 }