001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/spatialschema/Geometry.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 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 package org.deegree.model.spatialschema;
044
045 import java.io.Serializable;
046
047 import org.deegree.model.crs.CoordinateSystem;
048
049 /**
050 *
051 * The basic interface for all geometries. it declares the methods that are common to all
052 * geometries. this doesn't means for example that all geometries defines a valid boundary but is
053 * there asked for they should be able to answer (with null).
054 *
055 * <p>
056 * -----------------------------------------------------
057 * </p>
058 *
059 * @author Andreas Poth
060 * @version $Revision: 9343 $ $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $
061 * <p>
062 */
063 public interface Geometry extends Serializable {
064 /* #CS_CoordinateSystem lnkCS_CoordinateSystem; */
065
066 /**
067 * returns the bounding box of a geometry
068 */
069 Envelope getEnvelope();
070
071 /**
072 * returns the boundary of a geometry
073 */
074 Boundary getBoundary();
075
076 /**
077 * The operation "dimension" shall return the inherent dimension of this Geometry, which shall
078 * be less than or equal to the coordinate dimension. The dimension of a collection of geometric
079 * objects shall be the largest dimension of any of its pieces. Points are 0-dimensional, curves
080 * are 1-dimensional, surfaces are 2-dimensional, and solids are 3-dimensional.
081 */
082 int getDimension();
083
084 /**
085 * The operation "coordinateDimension" shall return the dimension of the coordinates that define
086 * this Geometry, which must be the same as the coordinate dimension of the coordinate reference
087 * system for this Geometry.
088 */
089 int getCoordinateDimension();
090
091 /**
092 * returns the spatial reference system of a geometry
093 */
094 CoordinateSystem getCoordinateSystem();
095
096 /**
097 * returns true if no geometry values resp. points stored within the geometry.
098 */
099 boolean isEmpty();
100
101 /**
102 * The operation "distance" shall return the distance between this Geometry and another
103 * Geometry. This distance is defined to be the greatest lower bound of the set of distances
104 * between all pairs of points that include one each from each of the two Geometries. A
105 * "distance" value shall be a positive number associated to distance units such as meters or
106 * standard foot. If necessary, the second geometric object shall be transformed into the same
107 * coordinate reference system as the first before the distance is calculated.
108 * <p>
109 * </p>
110 * If the geometric objects overlap, or touch, then their distance apart shall be zero. Some
111 * current implementations use a "negative" distance for such cases, but the approach is neither
112 * consistent between implementations, nor theoretically viable.
113 */
114 double distance( Geometry gmo );
115
116 /**
117 * translate a geometry by the submitted values. if the length of <tt>d</tt> is smaller then
118 * the dimension of the geometry only the first d.length'th coordinates will be translated. If
119 * the length of <tt>d</tt> is larger then the dimension of the geometry an
120 * ArrayIndexOutOfBoundExceptions raises.
121 */
122 void translate( double[] d );
123
124 /**
125 * The operation "centroid" shall return the mathematical centroid for this Geometry. The result
126 * is not guaranteed to be on the object. For heterogeneous collections of primitives, the
127 * centroid only takes into account those of the largest dimension. For example, when
128 * calculating the centroid of surfaces, an average is taken weighted by area. Since curves have
129 * no area they do not contribute to the average.
130 */
131 Point getCentroid();
132
133 /**
134 * The operation "convexHull" shall return a Geometry that represents the convex hull of this
135 * Geometry.
136 */
137 Geometry getConvexHull();
138
139 /**
140 * The operation "buffer" shall return a Geometry containing all points whose distance from this
141 * Geometry is less than or equal to the "distance" passed as a parameter. The Geometry returned
142 * is in the same reference system as this original Geometry. The dimension of the returned
143 * Geometry is normally the same as the coordinate dimension - a collection of Surfaces in 2D
144 * space and a collection of Solids in 3D space, but this may be application defined.
145 */
146 Geometry getBuffer( double distance );
147
148 /**
149 * The Boolean valued operation "contains" shall return TRUE if this Geometry contains another
150 * Geometry.
151 */
152 boolean contains( Geometry gmo );
153
154 /**
155 * The Boolean valued operation "contains" shall return TRUE if this Geometry contains a single
156 * point given by a coordinate.
157 */
158 boolean contains( Position position );
159
160 /**
161 * The Boolean valued operation "intersects" shall return TRUE if this Geometry intersects
162 * another Geometry. Within a Complex, the Primitives do not intersect one another. In general,
163 * topologically structured data uses shared geometric objects to capture intersection
164 * information.
165 */
166 boolean intersects( Geometry gmo );
167
168 /**
169 * The "union" operation shall return the set theoretic union of this Geometry and the passed
170 * Geometry.
171 */
172 Geometry union( Geometry gmo );
173
174 /**
175 * The "intersection" operation shall return the set theoretic intersection of this Geometry and
176 * the passed Geometry.
177 */
178 Geometry intersection( Geometry gmo )
179 throws GeometryException;
180
181 /**
182 * The "difference" operation shall return the set theoretic difference of this Geometry and the
183 * passed Geometry.
184 */
185 Geometry difference( Geometry gmo );
186
187 /**
188 * provide optimized proximity queries within for a distance . calvin added on 10/21/2003
189 */
190 boolean isWithinDistance( Geometry gmo, double distance );
191
192 /**
193 * sets tolerance value use for topological operations
194 *
195 * @param tolerance
196 */
197 void setTolerance( double tolerance );
198
199 /**
200 * returns the tolerance value use for topological operations
201 *
202 * @return tolerance value use for topological operations
203 */
204 double getTolerance();
205
206 }