001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/io/shpapi/shape_new/ShapeEnvelope.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 010 This library is free software; you can redistribute it and/or 011 modify it under the terms of the GNU Lesser General Public 012 License as published by the Free Software Foundation; either 013 version 2.1 of the License, or (at your option) any later version. 014 015 This library is distributed in the hope that it will be useful, 016 but WITHOUT ANY WARRANTY; without even the implied warranty of 017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 018 Lesser General Public License for more details. 019 020 You should have received a copy of the GNU Lesser General Public 021 License along with this library; if not, write to the Free Software 022 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 023 024 Contact: 025 026 Andreas Poth 027 lat/lon GmbH 028 Aennchenstr. 19 029 53177 Bonn 030 Germany 031 E-Mail: poth@lat-lon.de 032 033 Prof. Dr. Klaus Greve 034 Department of Geography 035 University of Bonn 036 Meckenheimer Allee 166 037 53115 Bonn 038 Germany 039 E-Mail: greve@giub.uni-bonn.de 040 041 ---------------------------------------------------------------------------*/ 042 package org.deegree.io.shpapi.shape_new; 043 044 import org.deegree.model.spatialschema.ByteUtils; 045 import org.deegree.model.spatialschema.Envelope; 046 import org.deegree.model.spatialschema.Geometry; 047 048 /** 049 * <code>ShapeEnvelope</code> encapsulates a shapefile envelope. 050 * 051 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a> 052 * @author last edited by: $Author: apoth $ 053 * 054 * @version $Revision: 9342 $, $Date: 2007-12-27 13:32:57 +0100 (Do, 27 Dez 2007) $ 055 */ 056 public class ShapeEnvelope implements Shape { 057 058 /** 059 * The minimum x value. 060 */ 061 public double xmin; 062 063 /** 064 * The maximum x value. 065 */ 066 public double xmax; 067 068 /** 069 * The minimum y value. 070 */ 071 public double ymin; 072 073 /** 074 * The maximum y value. 075 */ 076 public double ymax; 077 078 /** 079 * The minimum z value. 080 */ 081 public double zmin; 082 083 /** 084 * The maximum z value. 085 */ 086 public double zmax; 087 088 /** 089 * The minimum m value. 090 */ 091 public double mmin; 092 093 /** 094 * The maximum m value. 095 */ 096 public double mmax; 097 098 private boolean isZ, isM; 099 100 /** 101 * Copy constructor. Better to do with clone()? 102 * 103 * @param s 104 */ 105 public ShapeEnvelope( ShapeEnvelope s ) { 106 xmin = s.xmin; 107 xmax = s.xmax; 108 ymin = s.ymin; 109 ymax = s.ymax; 110 zmin = s.zmin; 111 zmax = s.zmax; 112 mmin = s.mmin; 113 mmax = s.mmax; 114 isZ = s.isZ; 115 isM = s.isM; 116 } 117 118 /** 119 * Creates a new envelope, with/out z and m dimensions as specified. 120 * 121 * @param z 122 * @param m 123 */ 124 public ShapeEnvelope( boolean z, boolean m ) { 125 isZ = z; 126 isM = m; 127 } 128 129 /** 130 * Construct one from deegree Envelope. 131 * 132 * @param env 133 */ 134 public ShapeEnvelope( Envelope env ) { 135 xmin = env.getMin().getX(); 136 ymin = env.getMin().getY(); 137 zmin = env.getMin().getZ(); 138 xmax = env.getMax().getX(); 139 ymax = env.getMax().getY(); 140 zmax = env.getMax().getZ(); 141 isZ = true; 142 } 143 144 /** 145 * Extends this envelope to z and m direction. 146 * 147 * @param z_min 148 * @param z_max 149 * @param m_min 150 * @param m_max 151 */ 152 public void extend( double z_min, double z_max, double m_min, double m_max ) { 153 this.zmin = z_min; 154 this.zmax = z_max; 155 this.mmin = m_min; 156 this.mmax = m_max; 157 158 isZ = true; 159 } 160 161 /** 162 * Extends this envelope to m direction. 163 * 164 * @param m_min 165 * @param m_max 166 */ 167 public void extend( double m_min, double m_max ) { 168 this.mmin = m_min; 169 this.mmax = m_max; 170 171 isM = true; 172 } 173 174 /** 175 * Extends the envelope so the given point fits in. 176 * 177 * @param x 178 * @param y 179 */ 180 public void fit( double x, double y ) { 181 xmin = Math.min( x, xmin ); 182 xmax = Math.max( x, xmax ); 183 ymin = Math.min( y, ymin ); 184 ymax = Math.max( y, ymax ); 185 } 186 187 /** 188 * Extends the envelope so the given point fits in. 189 * 190 * @param x 191 * @param y 192 * @param z 193 */ 194 public void fit( double x, double y, double z ) { 195 fit( x, y ); 196 zmin = Math.min( z, zmin ); 197 zmax = Math.max( z, zmax ); 198 } 199 200 /** 201 * Extends the envelope so the given envelope fits in. 202 * 203 * @param s 204 */ 205 public void fit( ShapeEnvelope s ) { 206 if ( s.isZ ) { 207 fit( s.xmin, s.ymin, s.zmin ); 208 fit( s.xmax, s.ymax, s.zmax ); 209 } else { 210 fit( s.xmin, s.ymin ); 211 fit( s.xmax, s.ymax ); 212 } 213 } 214 215 /* 216 * (non-Javadoc) 217 * 218 * @see org.deegree.io.shpapi.Shape#getByteLength() 219 */ 220 public int getByteLength() { 221 int len = 32; 222 if ( isZ ) { 223 len += 32; 224 } 225 if ( isM ) { 226 len += 16; 227 } 228 return len; 229 } 230 231 /** 232 * Reads only x and y values. 233 * 234 * @see org.deegree.io.shpapi.shape_new.Shape#read(byte[], int) 235 */ 236 public int read( byte[] bytes, int offset ) { 237 int off = offset; 238 239 xmin = ByteUtils.readLEDouble( bytes, off ); 240 off += 8; 241 242 ymin = ByteUtils.readLEDouble( bytes, off ); 243 off += 8; 244 245 xmax = ByteUtils.readLEDouble( bytes, off ); 246 off += 8; 247 248 ymax = ByteUtils.readLEDouble( bytes, off ); 249 off += 8; 250 251 return off; 252 } 253 254 /** 255 * Writes only x and y values. 256 * 257 * @see org.deegree.io.shpapi.shape_new.Shape#write(byte[], int) 258 */ 259 public int write( byte[] bytes, int offset ) { 260 int off = offset; 261 262 ByteUtils.writeLEDouble( bytes, off, xmin ); 263 off += 8; 264 265 ByteUtils.writeLEDouble( bytes, off, ymin ); 266 off += 8; 267 268 ByteUtils.writeLEDouble( bytes, off, xmax ); 269 off += 8; 270 271 ByteUtils.writeLEDouble( bytes, off, ymax ); 272 off += 8; 273 274 return off; 275 } 276 277 /** 278 * @return zero, because the envelope does not have a type 279 * @see org.deegree.io.shpapi.shape_new.Shape#getType() 280 */ 281 public int getType() { 282 return 0; 283 } 284 285 /** 286 * @return itself, of course 287 * @see org.deegree.io.shpapi.shape_new.Shape#getEnvelope() 288 */ 289 public ShapeEnvelope getEnvelope() { 290 return this; 291 } 292 293 @Override 294 public String toString() { 295 StringBuffer sb = new StringBuffer( 200 ); 296 sb.append( "x: " ).append( xmin ).append( "/" ).append( xmax ); 297 sb.append( ", y: " ).append( ymin ).append( "/" ).append( ymax ); 298 if ( isZ ) { 299 sb.append( ", z: " ).append( zmin ).append( "/" ).append( zmax ); 300 } 301 if ( isM || isZ ) { 302 sb.append( ", m: " ).append( mmin ).append( "/" ).append( mmax ); 303 } 304 return sb.toString(); 305 } 306 307 /** 308 * @return null, because an envelope is not a geometry 309 * @see org.deegree.io.shpapi.shape_new.Shape#getGeometry() 310 */ 311 public Geometry getGeometry() { 312 return null; 313 } 314 315 }