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    }