001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/spatialschema/Geometry.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    package org.deegree.model.spatialschema;
044    
045    import java.io.Serializable;
046    
047    import org.deegree.model.crs.CoordinateSystem;
048    
049    
050    /**
051    *
052    * The basic interface for all geometries. it declares the methods that
053    * are common to all geometries. this doesn't means for example that all
054    * geometries defines a valid boundary but is there asked for they should
055    * be able to answer (with null).
056    *
057    * <p>-----------------------------------------------------</p>
058    *
059    * @author Andreas Poth
060    * @version $Revision: 6259 $ $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 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
078         * Geometry, which shall be less than or equal to the coordinate dimension.
079         * The dimension of a collection of geometric objects shall be the largest
080         * dimension of any of its pieces. Points are 0-dimensional, curves are
081         * 1-dimensional, surfaces are 2-dimensional, and solids are 3-dimensional.
082         */
083        int getDimension();
084    
085        /**
086         * The operation "coordinateDimension" shall return the dimension of the
087         * coordinates that define this Geometry, which must be the same as the
088         * coordinate dimension of the coordinate reference system for this Geometry.
089         */
090        int getCoordinateDimension();
091    
092        /**
093         * returns the spatial reference system of a geometry
094         */
095        CoordinateSystem getCoordinateSystem();
096    
097    
098        /**
099         * returns true if no geometry values resp. points stored
100         * within the geometry.
101         */
102        boolean isEmpty();
103    
104        /**
105         * The operation "distance" shall return the distance between this Geometry
106         * and another Geometry. This distance is defined to be the greatest lower
107         * bound of the set of distances between all pairs of points that include
108         * one each from each of the two Geometries. A "distance" value shall be a
109         * positive number associated to distance units such as meters or standard
110         * foot. If necessary, the second geometric object shall be transformed into
111         * the same coordinate reference system as the first before the distance is
112         * calculated.<p></p>
113         * If the geometric objects overlap, or touch, then their distance apart
114         * shall be zero. Some current implementations use a "negative" distance for
115         * such cases, but the approach is neither consistent between implementations,
116         * nor theoretically viable.
117         */
118        double distance(Geometry gmo);
119    
120        /**
121         * translate a geometry by the submitted values. if the length
122         * of <tt>d</tt> is smaller then the dimension of the geometry
123         * only the first d.length'th coordinates will be translated.
124         * If the length of <tt>d</tt> is larger then the dimension of
125         * the geometry an ArrayIndexOutOfBoundExceptions raises.
126         */
127        void translate(double[] d);
128    
129        /**
130         * The operation "centroid" shall return the mathematical centroid for this
131         * Geometry. The result is not guaranteed to be on the object. For heterogeneous
132         * collections of primitives, the centroid only takes into account those of the
133         * largest dimension. For example, when calculating the centroid of surfaces,
134         * an average is taken weighted by area. Since curves have no area they do not
135         * contribute to the average.
136         */
137        Point getCentroid();
138    
139        /**
140         * The operation "convexHull" shall return a Geometry that represents the
141         * convex hull of this Geometry.
142         */
143        Geometry getConvexHull();
144    
145        /**
146         * The operation "buffer" shall return a Geometry containing all points whose
147         * distance from this Geometry is less than or equal to the "distance" passed
148         * as a parameter. The Geometry returned is in the same reference system as
149         * this original Geometry. The dimension of the returned Geometry is normally
150         * the same as the coordinate dimension - a collection of Surfaces in 2D
151         * space and a collection of Solids in 3D space, but this may be application
152         * defined.
153         */
154        Geometry getBuffer(double distance);
155    
156        /**
157         * The Boolean valued operation "contains" shall return TRUE if this Geometry
158         * contains another Geometry.
159         */
160        boolean contains(Geometry gmo);
161    
162        /**
163         * The Boolean valued operation "contains" shall return TRUE if this Geometry
164         * contains a single point given by a coordinate.
165         */
166        boolean contains(Position position);
167    
168        /**
169         * The Boolean valued operation "intersects" shall return TRUE if this Geometry
170         * intersects another Geometry. Within a Complex, the Primitives do not
171         * intersect one another. In general, topologically structured data uses shared
172         * geometric objects to capture intersection information.
173         */
174        boolean intersects(Geometry gmo);
175    
176        /**
177         * The "union" operation shall return the set theoretic union of this Geometry
178         * and the passed Geometry.
179         */
180        Geometry union(Geometry gmo);
181    
182        /**
183         * The "intersection" operation shall return the set theoretic intersection
184         * of this Geometry and the passed Geometry.
185         */
186        Geometry intersection(Geometry gmo) throws GeometryException;
187    
188        /**
189         * The "difference" operation shall return the set theoretic difference of
190         * this Geometry and the passed Geometry.
191         */
192        Geometry difference(Geometry gmo);
193    
194         /**
195         provide optimized proximity queries within for a distance .
196         calvin  added on 10/21/2003
197        */
198        boolean isWithinDistance(Geometry gmo, double distance);
199        
200        /**
201         * sets tolerance value use for topological operations
202         * @param tolerance
203         */
204        void setTolerance(double tolerance);
205        
206        /**
207         * returns the tolerance value use for topological operations
208         * @return tolerance value use for topological operations
209         */
210        double getTolerance();
211    
212    }
213    /* ********************************************************************
214    Changes to this class. What the people have been up to:
215    $Log$
216    Revision 1.10  2007/02/22 11:24:19  poth
217    support for tolerance added form some topological operations
218    
219    Revision 1.9  2006/11/27 09:07:51  poth
220    JNI integration of proj4 has been removed. The CRS functionality now will be done by native deegree code.
221    
222    Revision 1.8  2006/07/12 14:46:15  poth
223    comment footer added
224    
225    ********************************************************************** */