GEOS 3.6.2
Geometry.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>
7 * Copyright (C) 2005 2006 Refractions Research Inc.
8 * Copyright (C) 2001-2002 Vivid Solutions Inc.
9 *
10 * This is free software; you can redistribute and/or modify it under
11 * the terms of the GNU Lesser General Public Licence as published
12 * by the Free Software Foundation.
13 * See the COPYING file for more information.
14 *
15 **********************************************************************
16 *
17 * Last port: geom/Geometry.java rev. 1.112
18 *
19 **********************************************************************/
20
21#ifndef GEOS_GEOM_GEOMETRY_H
22#define GEOS_GEOM_GEOMETRY_H
23
24#include <geos/export.h>
25#include <geos/platform.h>
26#include <geos/inline.h>
27#include <geos/geom/Envelope.h>
28#include <geos/geom/Dimension.h> // for Dimension::DimensionType
29#include <geos/geom/GeometryComponentFilter.h> // for inheritance
30
31#include <string>
32#include <iostream>
33#include <vector>
34#include <memory>
35
36#ifdef _MSC_VER
37#pragma warning(push)
38#pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
39#pragma warning(disable: 4355) // warning C4355: 'this' : used in base member initializer list
40#endif
41
42// Forward declarations
43namespace geos {
44 namespace geom {
45 class Coordinate;
46 class CoordinateFilter;
50 class GeometryFactory;
51 class GeometryFilter;
53 class PrecisionModel;
54 class Point;
55 }
56 namespace io { // geos.io
57 class Unload;
58 } // namespace geos.io
59}
60
61namespace geos {
62namespace geom { // geos::geom
63
83
167class GEOS_DLL Geometry {
168
169public:
170
171 friend class GeometryFactory;
172
174 typedef std::vector<const Geometry *> ConstVect;
175
177 typedef std::vector<Geometry *> NonConstVect;
178
180 typedef std::auto_ptr<Geometry> AutoPtr;
181
183 virtual Geometry* clone() const=0;
184
186 virtual ~Geometry();
187
188
196 const GeometryFactory* getFactory() const { return _factory; }
197
211 void setUserData(void* newUserData) { _userData=newUserData; }
212
219 void* getUserData() const { return _userData; }
220
221 /*
222 * \brief
223 * Returns the ID of the Spatial Reference System used by the
224 * <code>Geometry</code>.
225 *
226 * GEOS supports Spatial Reference System information in the simple way
227 * defined in the SFS. A Spatial Reference System ID (SRID) is present
228 * in each <code>Geometry</code> object. <code>Geometry</code>
229 * provides basic accessor operations for this field, but no others.
230 * The SRID is represented as an integer.
231 *
232 * @return the ID of the coordinate space in which the
233 * <code>Geometry</code> is defined.
234 *
235 */
236 virtual int getSRID() const { return SRID; }
237
238 /*
239 * Sets the ID of the Spatial Reference System used by the
240 * <code>Geometry</code>.
241 */
242 virtual void setSRID(int newSRID) { SRID=newSRID; }
243
249
254 virtual const Coordinate* getCoordinate() const=0; //Abstract
255
261 virtual CoordinateSequence* getCoordinates() const=0; //Abstract
262
264 virtual std::size_t getNumPoints() const=0; //Abstract
265
267 virtual bool isSimple() const;
268
270 virtual std::string getGeometryType() const=0; //Abstract
271
273 virtual GeometryTypeId getGeometryTypeId() const=0; //Abstract
274
277 virtual std::size_t getNumGeometries() const { return 1; }
278
281 virtual const Geometry* getGeometryN(std::size_t /*n*/) const { return this; }
282
292 virtual bool isValid() const;
293
295 virtual bool isEmpty() const=0; //Abstract
296
298 virtual bool isRectangle() const { return false; }
299
301 virtual Dimension::DimensionType getDimension() const=0; //Abstract
302
304 virtual int getCoordinateDimension() const=0; //Abstract
305
322 virtual Geometry* getBoundary() const=0; //Abstract
323
325 virtual int getBoundaryDimension() const=0; //Abstract
326
328 virtual Geometry* getEnvelope() const;
329
334 virtual const Envelope* getEnvelopeInternal() const;
335
352 virtual bool disjoint(const Geometry *other) const;
353
358 virtual bool touches(const Geometry *other) const;
359
361 virtual bool intersects(const Geometry *g) const;
362
385 virtual bool crosses(const Geometry *g) const;
386
391 virtual bool within(const Geometry *g) const;
392
394 virtual bool contains(const Geometry *g) const;
395
401 virtual bool overlaps(const Geometry *g) const;
402
417 virtual bool relate(const Geometry *g,
418 const std::string& intersectionPattern) const;
419
420 bool relate(const Geometry& g, const std::string& intersectionPattern) const
421 {
422 return relate(&g, intersectionPattern);
423 }
424
426 virtual IntersectionMatrix* relate(const Geometry *g) const;
427 IntersectionMatrix* relate(const Geometry &g) const {
428 return relate(&g);
429 }
430
436 virtual bool equals(const Geometry *g) const;
437
476 bool covers(const Geometry* g) const;
477
508 bool coveredBy(const Geometry* g) const {
509 return g->covers(this);
510 }
511
512
514 virtual std::string toString() const;
515
516 virtual std::string toText() const;
517
519 //
522 virtual Geometry* buffer(double distance) const;
523
528 //
531 virtual Geometry* buffer(double distance,int quadrantSegments) const;
532
569 virtual Geometry* buffer(double distance, int quadrantSegments,
570 int endCapStyle) const;
571
575 virtual Geometry* convexHull() const;
576
586 virtual Geometry* intersection(const Geometry *other) const;
587
597 Geometry* Union(const Geometry *other) const;
598 // throw(IllegalArgumentException *, TopologyException *);
599
617 AutoPtr Union() const;
618 // throw(IllegalArgumentException *, TopologyException *);
619
630 virtual Geometry* difference(const Geometry *other) const;
631
641 virtual Geometry* symDifference(const Geometry *other) const;
642
647 virtual bool equalsExact(const Geometry *other, double tolerance=0)
648 const=0; //Abstract
649
650 virtual void apply_rw(const CoordinateFilter *filter)=0; //Abstract
651 virtual void apply_ro(CoordinateFilter *filter) const=0; //Abstract
652 virtual void apply_rw(GeometryFilter *filter);
653 virtual void apply_ro(GeometryFilter *filter) const;
654 virtual void apply_rw(GeometryComponentFilter *filter);
655 virtual void apply_ro(GeometryComponentFilter *filter) const;
656
665 virtual void apply_rw(CoordinateSequenceFilter& filter)=0;
666
673 virtual void apply_ro(CoordinateSequenceFilter& filter) const=0;
674
684 template <class T>
685 void applyComponentFilter(T& f) const
686 {
687 for(std::size_t i=0, n=getNumGeometries(); i<n; ++i)
688 f.filter(getGeometryN(i));
689 }
690
692 virtual void normalize()=0; //Abstract
693
694 virtual int compareTo(const Geometry *geom) const;
695
700 virtual double distance(const Geometry *g) const;
701
703 virtual double getArea() const;
704
706 virtual double getLength() const;
707
719 virtual bool isWithinDistance(const Geometry *geom,
720 double cDistance) const;
721
731 virtual Point* getCentroid() const;
732
734 //
737 virtual bool getCentroid(Coordinate& ret) const;
738
749 virtual Point* getInteriorPoint() const;
750
751 /*
752 * \brief
753 * Notifies this Geometry that its Coordinates have been changed
754 * by an external party (using a CoordinateFilter, for example).
755 */
756 virtual void geometryChanged();
757
764
765protected:
766
768 mutable std::auto_ptr<Envelope> envelope;
769
771 static bool hasNonEmptyElements(const std::vector<Geometry *>* geometries);
772
774 static bool hasNullElements(const CoordinateSequence* list);
775
777 static bool hasNullElements(const std::vector<Geometry *>* lrs);
778
779// static void reversePointOrder(CoordinateSequence* coordinates);
780// static Coordinate& minCoordinate(CoordinateSequence* coordinates);
781// static void scroll(CoordinateSequence* coordinates,Coordinate* firstCoordinate);
782// static int indexOf(Coordinate* coordinate,CoordinateSequence* coordinates);
783//
788 virtual bool isEquivalentClass(const Geometry *other) const;
789
790 static void checkNotGeometryCollection(const Geometry *g);
791 // throw(IllegalArgumentException *);
792
793 //virtual void checkEqualSRID(Geometry *other);
794
795 //virtual void checkEqualPrecisionModel(Geometry *other);
796
797 virtual Envelope::AutoPtr computeEnvelopeInternal() const=0; //Abstract
798
799 virtual int compareToSameClass(const Geometry *geom) const=0; //Abstract
800
801 int compare(std::vector<Coordinate> a, std::vector<Coordinate> b) const;
802
803 int compare(std::vector<Geometry *> a, std::vector<Geometry *> b) const;
804
805 bool equal(const Coordinate& a, const Coordinate& b,
806 double tolerance) const;
807 int SRID;
808
810 //Geometry* toInternalGeometry(const Geometry *g) const;
811
813 //Geometry* fromInternalGeometry(const Geometry *g) const;
814
816 //virtual bool isRectangle() const { return false; } -- moved to public
817
819
829 Geometry(const GeometryFactory *factory);
830
831private:
832
833 int getClassSortIndex() const;
834
835 class GEOS_DLL GeometryChangedFilter : public GeometryComponentFilter
836 {
837 public:
838 void filter_rw(Geometry* geom);
839 };
840
841 static GeometryChangedFilter geometryChangedFilter;
842
844 //
847 const GeometryFactory* _factory;
848
849 void* _userData;
850};
851
856GEOS_DLL std::ostream& operator<< (std::ostream& os, const Geometry& geom);
857
858struct GEOS_DLL GeometryGreaterThen {
859 bool operator()(const Geometry *first, const Geometry *second);
860};
861
862
864std::string geosversion();
865
871std::string jtsport();
872
873// We use this instead of std::pair<auto_ptr<Geometry>> because C++11
874// forbids that construct:
875// http://lwg.github.com/issues/lwg-closed.html#2068
876struct GeomPtrPair {
877 typedef std::auto_ptr<Geometry> GeomPtr;
878 GeomPtr first;
879 GeomPtr second;
880};
881
882} // namespace geos::geom
883} // namespace geos
884
885#ifdef _MSC_VER
886#pragma warning(pop)
887#endif
888
889#endif // ndef GEOS_GEOM_GEOMETRY_H
Definition CoordinateFilter.h:43
Definition CoordinateSequenceFilter.h:58
The internal representation of a list of coordinates inside a Geometry.
Definition CoordinateSequence.h:59
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:60
DimensionType
Definition Dimension.h:31
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition Envelope.h:53
Definition GeometryComponentFilter.h:43
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
Definition GeometryFactory.h:67
Geometry classes support the concept of applying a Geometry filter to the Geometry.
Definition GeometryFilter.h:48
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition Geometry.h:167
virtual Geometry * getEnvelope() const
Returns this Geometrys bounding box.
virtual int getBoundaryDimension() const =0
Returns the dimension of this Geometrys inherent boundary.
void applyComponentFilter(T &f) const
Apply a fiter to each component of this geometry. The filter is expected to provide a ....
Definition Geometry.h:685
virtual ~Geometry()
Destroy Geometry and all components.
virtual bool equals(const Geometry *g) const
Returns true if the DE-9IM intersection matrix for the two Geometrys is T*F**FFF*.
void geometryChangedAction()
Notifies this Geometry that its Coordinates have been changed by an external party.
virtual void apply_rw(CoordinateSequenceFilter &filter)=0
const PrecisionModel * getPrecisionModel() const
Get the PrecisionModel used to create this Geometry.
virtual bool equalsExact(const Geometry *other, double tolerance=0) const =0
Returns true if the two Geometrys are exactly equal, up to a specified tolerance.
virtual void normalize()=0
Converts this Geometry to normal form (or canonical form).
virtual void apply_ro(CoordinateSequenceFilter &filter) const =0
virtual bool intersects(const Geometry *g) const
Returns true if disjoint returns false.
virtual Geometry * getBoundary() const =0
Returns the boundary, or an empty geometry of appropriate dimension if this Geometry is empty.
virtual bool crosses(const Geometry *g) const
virtual GeometryTypeId getGeometryTypeId() const =0
Return an integer representation of this Geometry type.
virtual bool relate(const Geometry *g, const std::string &intersectionPattern) const
Returns true if the elements in the DE-9IM intersection matrix for the two Geometrys match the elemen...
virtual std::string getGeometryType() const =0
Return a string representation of this Geometry type.
virtual bool isWithinDistance(const Geometry *geom, double cDistance) const
Tests whether the distance from this Geometry to another is less than or equal to a specified value.
static bool hasNonEmptyElements(const std::vector< Geometry * > *geometries)
Returns true if the array contains any non-empty Geometrys.
virtual double getLength() const
Returns the length of this Geometry.
virtual double distance(const Geometry *g) const
Returns the minimum distance between this Geometry and the Geometry g.
AutoPtr Union() const
virtual CoordinateSequence * getCoordinates() const =0
Returns this Geometry vertices. Caller takes ownership of the returned object.
virtual bool getCentroid(Coordinate &ret) const
Computes the centroid of this Geometry as a Coordinate.
virtual const Geometry * getGeometryN(std::size_t) const
Definition Geometry.h:281
virtual Geometry * difference(const Geometry *other) const
Returns a Geometry representing the points making up this Geometry that do not make up other.
virtual Geometry * intersection(const Geometry *other) const
Returns a Geometry representing the points shared by this Geometry and other.
virtual bool within(const Geometry *g) const
Returns true if the DE-9IM intersection matrix for the two Geometrys is T*F**F***.
virtual std::size_t getNumPoints() const =0
Returns the count of this Geometrys vertices.
static bool hasNullElements(const CoordinateSequence *list)
Returns true if the CoordinateSequence contains any null elements.
void setUserData(void *newUserData)
A simple scheme for applications to add their own custom data to a Geometry. An example use might be ...
Definition Geometry.h:211
virtual bool isEmpty() const =0
Returns whether or not the set of points in this Geometry is empty.
virtual Geometry * buffer(double distance) const
Returns a buffer region around this Geometry having the given width.
Geometry(const GeometryFactory *factory)
Construct a geometry with the given GeometryFactory.
const GeometryFactory * getFactory() const
Gets the factory which contains the context in which this geometry was created.
Definition Geometry.h:196
Geometry * Union(const Geometry *other) const
Returns a Geometry representing all the points in this Geometry and other.
virtual Point * getCentroid() const
Computes the centroid of this Geometry.
virtual bool touches(const Geometry *other) const
Returns true if the DE-9IM intersection matrix for the two Geometrys is FT*******,...
virtual const Coordinate * getCoordinate() const =0
Returns a vertex of this Geometry, or NULL if this is the empty geometry.
virtual IntersectionMatrix * relate(const Geometry *g) const
Returns the DE-9IM intersection matrix for the two Geometrys.
virtual std::string toString() const
Returns the Well-known Text representation of this Geometry.
virtual Geometry * clone() const =0
Make a deep-copy of this Geometry.
virtual bool isValid() const
Tests the validity of this Geometry.
virtual bool isSimple() const
Returns false if the Geometry not simple.
Geometry(const Geometry &geom)
Polygon overrides to check for actual rectangle.
void * getUserData() const
Gets the user data object for this geometry, if any.
Definition Geometry.h:219
virtual bool disjoint(const Geometry *other) const
virtual bool contains(const Geometry *g) const
Returns true if other.within(this) returns true.
virtual bool isEquivalentClass(const Geometry *other) const
Returns whether the two Geometrys are equal, from the point of view of the equalsExact method.
bool coveredBy(const Geometry *g) const
Tests whether this geometry is covered by the specified geometry.
Definition Geometry.h:508
virtual const Envelope * getEnvelopeInternal() const
Returns the minimum and maximum x and y values in this Geometry, or a null Envelope if this Geometry ...
virtual std::size_t getNumGeometries() const
Definition Geometry.h:277
virtual double getArea() const
Returns the area of this Geometry.
virtual Point * getInteriorPoint() const
Computes an interior point of this Geometry.
std::auto_ptr< Geometry > AutoPtr
An auto_ptr of Geometry.
Definition Geometry.h:180
virtual Geometry * symDifference(const Geometry *other) const
Returns a set combining the points in this Geometry not in other, and the points in other not in this...
virtual int getCoordinateDimension() const =0
Returns the coordinate dimension of this Geometry (2=XY, 3=XYZ, 4=XYZM in future).
virtual Geometry * convexHull() const
Returns the smallest convex Polygon that contains all the points in the Geometry.
static bool hasNullElements(const std::vector< Geometry * > *lrs)
Returns true if the vector contains any null elements.
virtual bool isRectangle() const
Polygon overrides to check for actual rectangle.
Definition Geometry.h:298
virtual bool overlaps(const Geometry *g) const
Returns true if the DE-9IM intersection matrix for the two Geometrys is T*T***T** (for two points or ...
virtual Geometry * buffer(double distance, int quadrantSegments) const
Returns a buffer region around this Geometry having the given width and with a specified number of se...
bool covers(const Geometry *g) const
Returns true if this geometry covers the specified geometry.
virtual Dimension::DimensionType getDimension() const =0
Returns the dimension of this Geometry (0=point, 1=line, 2=surface).
std::vector< Geometry * > NonConstVect
A vector of non-const Geometry pointers.
Definition Geometry.h:177
std::auto_ptr< Envelope > envelope
The bounding box of this Geometry.
Definition Geometry.h:768
std::vector< const Geometry * > ConstVect
A vector of const Geometry pointers.
Definition Geometry.h:174
virtual Geometry * buffer(double distance, int quadrantSegments, int endCapStyle) const
Computes a buffer area around this geometry having the given width and with a specified accuracy of a...
Implementation of Dimensionally Extended Nine-Intersection Model (DE-9IM) matrix.
Definition IntersectionMatrix.h:51
Definition Point.h:68
Specifies the precision model of the Coordinate in a Geometry.
Definition PrecisionModel.h:87
Contains the Geometry interface hierarchy and supporting classes.
Definition IndexedNestedRingTester.h:26
GeometryTypeId
Geometry types.
Definition Geometry.h:65
@ GEOS_MULTILINESTRING
a collection of linestrings
Definition Geometry.h:77
@ GEOS_LINEARRING
a linear ring (linestring with 1st point == last point)
Definition Geometry.h:71
@ GEOS_GEOMETRYCOLLECTION
a collection of heterogeneus geometries
Definition Geometry.h:81
@ GEOS_POINT
a point
Definition Geometry.h:67
@ GEOS_LINESTRING
a linestring
Definition Geometry.h:69
@ GEOS_POLYGON
a polygon
Definition Geometry.h:73
@ GEOS_MULTIPOLYGON
a collection of polygons
Definition Geometry.h:79
@ GEOS_MULTIPOINT
a collection of points
Definition Geometry.h:75
GEOS_DLL std::ostream & operator<<(std::ostream &os, const Coordinate &c)
Output function.
std::string jtsport()
Return the version of JTS this GEOS release has been ported from.
std::string geosversion()
Return current GEOS version.
Contains the interfaces for converting JTS objects to and from other formats.
Definition Geometry.h:56
Basic namespace for all GEOS functionalities.
Definition IndexedNestedRingTester.h:25