001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/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 05:30:32 -0800 (Thu, 27 Dec 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) throws GeometryException;
179:
180: /**
181: * The "difference" operation shall return the set theoretic difference of this Geometry and the
182: * passed Geometry.
183: */
184: Geometry difference(Geometry gmo);
185:
186: /**
187: * provide optimized proximity queries within for a distance . calvin added on 10/21/2003
188: */
189: boolean isWithinDistance(Geometry gmo, double distance);
190:
191: /**
192: * sets tolerance value use for topological operations
193: *
194: * @param tolerance
195: */
196: void setTolerance(double tolerance);
197:
198: /**
199: * returns the tolerance value use for topological operations
200: *
201: * @return tolerance value use for topological operations
202: */
203: double getTolerance();
204:
205: }
|