001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/spatialschema/PositionImpl.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2006 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 Aennchenstr. 19
030 53115 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 ---------------------------------------------------------------------------*/
044 package org.deegree.model.spatialschema;
045
046 import java.io.Serializable;
047
048 /**
049 * A sequence of decimals numbers which when written on a width are a sequence of coordinate
050 * positions. The width is derived from the CRS or coordinate dimension of the container.
051 *
052 * <p>
053 * -----------------------------------------------------------------------
054 * </p>
055 *
056 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
057 * @author last edited by: $Author: bezema $
058 * @version $Revision: 6259 $ $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
059 */
060 class PositionImpl implements Position, Serializable {
061 /** Use serialVersionUID for interoperability. */
062 private final static long serialVersionUID = -3780255674921824356L;
063
064 private double[] point = null;
065
066 private double accuracy = 0.000001;
067
068 private int dimension = 3;
069
070 /**
071 * constructor. initializes a point to the coordinate 0/0
072 */
073 PositionImpl() {
074 point = new double[] { 0, 0, 0 };
075 }
076
077 /**
078 * constructor
079 *
080 * @param x
081 * x-value of the point
082 * @param y
083 * y-value of the point
084 */
085 PositionImpl( double x, double y ) {
086 point = new double[] { x, y, Double.NaN };
087 dimension = 2;
088 }
089
090 /**
091 * constructor
092 *
093 * @param x
094 * x-value of the point
095 * @param y
096 * y-value of the point
097 * @param z
098 * z-value of the point
099 */
100 PositionImpl( double x, double y, double z ) {
101 point = new double[] { x, y, z };
102 }
103
104 /**
105 * constructor.
106 *
107 * @param coords
108 * the Coordinates from which the position is build.
109 */
110 PositionImpl( double[] coords ) {
111 if ( coords.length == 3 && !Double.isNaN( coords[2] ) ) {
112 dimension = 3;
113 } else {
114 if ( coords.length == 2 ) {
115 coords = new double[] { coords[0], coords[1], Double.NaN };
116 }
117 dimension = 2;
118 }
119 point = coords;
120 }
121
122 /**
123 * @return the coordinate dimension of the position
124 */
125 public int getCoordinateDimension() {
126 return dimension;
127 }
128
129 /**
130 * @return a shallow copy of the geometry.
131 */
132 @Override
133 public Object clone() {
134 return new PositionImpl( point.clone() );
135 }
136
137 /**
138 * @return the x-value of this point
139 */
140 public double getX() {
141 return point[0];
142 }
143
144 /**
145 * @return the y-value of this point
146 */
147 public double getY() {
148 return point[1];
149 }
150
151 /**
152 * @return the z-value of this point.
153 */
154 public double getZ() {
155 return point[2];
156 }
157
158 /**
159 * @return the position as a array the first field contains the x- the second field the y-value
160 * etc.
161 *
162 * NOTE: The returned array always has a length of 3, regardless of the dimension. This is due
163 * to a limitation in the coordinate transformation package (proj4), which expects coordinates
164 * to have 3 dimensions.
165 */
166 public double[] getAsArray() {
167 return point;
168 }
169
170 /**
171 * translate the point by the submitted values. the <code>dz</code>- value will be ignored.
172 *
173 * @param d
174 */
175 public void translate( double[] d ) {
176 for ( int i = 0; i < d.length; i++ ) {
177 point[i] += d[i];
178 }
179 }
180
181 /**
182 * compares if all field of other are equal to the corresponding fields of this position
183 */
184 @Override
185 public boolean equals( Object other ) {
186 boolean eq = true;
187 double[] other_ = ( (Position) other ).getAsArray();
188
189 if ( eq ) {
190 for ( int i = 0; i < dimension; i++ ) {
191 if ( Math.abs( point[i] - other_[i] ) > accuracy ) {
192 eq = false;
193 break;
194 }
195 }
196 }
197
198 return eq;
199 }
200
201 /**
202 * @return the accuracy the position is defined. The accuracy is measured in values of the CRS
203 * the positions coordinates are stored
204 */
205 public double getAccuracy() {
206 return accuracy;
207 }
208
209 /**
210 * @see #getAccuracy()
211 * @param accuracy
212 */
213 public void setAccuracy( double accuracy ) {
214 this.accuracy = accuracy;
215 }
216
217 @Override
218 public String toString() {
219 String ret = "Position: ";
220
221 for ( int i = 0; i < dimension; i++ ) {
222 ret += ( point[i] + " " );
223 }
224
225 return ret;
226 }
227 }
228
229 /***************************************************************************************************
230 * <code>
231 Changes to this class. What the people have been up to:
232
233 $Log$
234 Revision 1.14 2007/03/19 10:29:19 wanhoff
235 Fixed Javadoc (@param, @version)
236
237 Revision 1.13 2006/09/18 14:11:49 bezema
238 fixed documentation
239
240 Revision 1.12 2006/08/28 14:22:56 poth
241 bug fix coordinate dimension
242
243 Revision 1.11 2006/08/28 07:50:11 bezema
244 Added isNan support for the 3 dimension
245
246 Revision 1.10 2006/08/17 20:09:23 poth
247 bug fix - dimension determination
248
249 Revision 1.9 2006/07/12 14:46:15 poth
250 comment footer added
251
252 </code>
253 **************************************************************************************************/