GEOS  3.13.0dev
Geometry.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2009 2011 Sandro Santilli <strk@kbt.io>
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 #pragma once
22 
23 #ifndef USE_UNSTABLE_GEOS_CPP_API
24 #ifndef _MSC_VER
25 # warning "The GEOS C++ API is unstable, please use the C API instead"
26 # warning "HINT: #include geos_c.h"
27 #else
28 #pragma message("The GEOS C++ API is unstable, please use the C API instead")
29 #pragma message("HINT: #include geos_c.h")
30 #endif
31 #endif
32 
33 #include <geos/export.h>
34 #include <geos/geom/Envelope.h>
35 #include <geos/geom/Dimension.h> // for Dimension::DimensionType
36 #include <geos/geom/GeometryComponentFilter.h> // for inheritance
37 
38 #include <algorithm>
39 #include <string>
40 #include <iostream>
41 #include <vector>
42 #include <memory>
43 
44 #ifdef _MSC_VER
45 #pragma warning(push)
46 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
47 #pragma warning(disable: 4355) // warning C4355: 'this' : used in base member initializer list
48 #endif
49 
50 // Forward declarations
51 namespace geos {
52 namespace geom {
53 class Coordinate;
54 class CoordinateFilter;
55 class CoordinateSequence;
56 class CoordinateSequenceFilter;
57 class GeometryComponentFilter;
58 class GeometryFactory;
59 class GeometryFilter;
60 class PrecisionModel;
61 class Point;
62 class IntersectionMatrix;
63 }
64 namespace io { // geos.io
65 class Unload;
66 } // namespace geos.io
67 }
68 
69 namespace geos { // geos
70 namespace geom { // geos::geom
71 
90  GEOS_CIRCULARSTRING,
91  GEOS_COMPOUNDCURVE,
92  GEOS_CURVEPOLYGON,
93  GEOS_MULTICURVE,
94  GEOS_MULTISURFACE,
95 };
96 
97 enum GeometrySortIndex {
98  SORTINDEX_POINT = 0,
99  SORTINDEX_MULTIPOINT = 1,
100  SORTINDEX_LINESTRING = 2,
101  SORTINDEX_LINEARRING = 3,
102  SORTINDEX_MULTILINESTRING = 4,
103  SORTINDEX_POLYGON = 5,
104  SORTINDEX_MULTIPOLYGON = 6,
105  SORTINDEX_GEOMETRYCOLLECTION = 7,
106  SORTINDEX_CIRCULARSTRING = 8,
107  SORTINDEX_COMPOUNDCURVE = 9,
108  SORTINDEX_CURVEPOLYGON = 10,
109  SORTINDEX_MULTICURVE = 11,
110  SORTINDEX_MULTISURFACE = 12,
111 };
112 
196 class GEOS_DLL Geometry {
197 
198 public:
199 
200  friend class GeometryFactory;
201 
203  using ConstVect = std::vector<const Geometry*>;
204 
206  using NonConstVect = std::vector<Geometry*>;
207 
209  using Ptr = std::unique_ptr<Geometry> ;
210 
212  std::unique_ptr<Geometry> clone() const { return std::unique_ptr<Geometry>(cloneImpl()); }
213 
215  virtual ~Geometry();
216 
217 
225  const GeometryFactory*
226  getFactory() const
227  {
228  return _factory;
229  }
230 
244  void
245  setUserData(void* newUserData)
246  {
247  _userData = newUserData;
248  }
249 
256  void*
257  getUserData() const
258  {
259  return _userData;
260  }
261 
272  virtual int
273  getSRID() const
274  {
275  return SRID;
276  }
277 
281  virtual void
282  setSRID(int newSRID)
283  {
284  SRID = newSRID;
285  }
286 
292 
294  virtual const CoordinateXY* getCoordinate() const = 0; //Abstract
295 
301  virtual std::unique_ptr<CoordinateSequence> getCoordinates() const = 0; //Abstract
302 
304  virtual std::size_t getNumPoints() const = 0; //Abstract
305 
307  virtual bool isSimple() const;
308 
310  virtual std::string getGeometryType() const = 0; //Abstract
311 
313  virtual bool hasCurvedComponents() const;
314 
316  virtual GeometryTypeId getGeometryTypeId() const = 0; //Abstract
317 
325  virtual std::size_t
327  {
328  return 1;
329  }
330 
333  virtual const Geometry*
334  getGeometryN(std::size_t /*n*/) const
335  {
336  return this;
337  }
338 
348  virtual bool isValid() const;
349 
351  virtual bool isEmpty() const = 0; //Abstract
352 
354  virtual bool
355  isRectangle() const
356  {
357  return false;
358  }
359 
361  virtual Dimension::DimensionType getDimension() const = 0; //Abstract
362 
364  virtual bool hasDimension(Dimension::DimensionType d) const {
365  return getDimension() == d;
366  }
367 
370  return d == getDimension();
371  }
372 
373  bool isPuntal() const {
374  return isDimensionStrict(Dimension::P);
375  }
376 
377  bool isLineal() const {
378  return isDimensionStrict(Dimension::L);
379  }
380 
381  bool isPolygonal() const {
382  return isDimensionStrict(Dimension::A);
383  }
384 
385  bool isMixedDimension() const;
386  bool isMixedDimension(Dimension::DimensionType* baseDim) const;
387 
388  bool isCollection() const {
389  int t = getGeometryTypeId();
390  return t == GEOS_GEOMETRYCOLLECTION ||
391  t == GEOS_MULTIPOINT ||
392  t == GEOS_MULTILINESTRING ||
393  t == GEOS_MULTIPOLYGON;
394  }
395 
396  static GeometryTypeId multiTypeId(GeometryTypeId typeId) {
397  switch (typeId) {
398  case GEOS_POINT: return GEOS_MULTIPOINT;
400  case GEOS_POLYGON: return GEOS_MULTIPOLYGON;
401  default: return typeId;
402  }
403  }
404 
406  virtual uint8_t getCoordinateDimension() const = 0; //Abstract
407 
408  virtual bool hasZ() const = 0;
409 
410  virtual bool hasM() const = 0;
411 
428  virtual std::unique_ptr<Geometry> getBoundary() const = 0; //Abstract
429 
431  virtual int getBoundaryDimension() const = 0; //Abstract
432 
434  virtual std::unique_ptr<Geometry> getEnvelope() const;
435 
440  virtual const Envelope* getEnvelopeInternal() const = 0;
441 
458  virtual bool disjoint(const Geometry* other) const;
459 
464  virtual bool touches(const Geometry* other) const;
465 
467  virtual bool intersects(const Geometry* g) const;
468 
491  virtual bool crosses(const Geometry* g) const;
492 
497  virtual bool within(const Geometry* g) const;
498 
500  virtual bool contains(const Geometry* g) const;
501 
507  virtual bool overlaps(const Geometry* g) const;
508 
523  bool relate(const Geometry* g,
524  const std::string& intersectionPattern) const;
525 
526  bool
527  relate(const Geometry& g, const std::string& intersectionPattern) const
528  {
529  return relate(&g, intersectionPattern);
530  }
531 
533  std::unique_ptr<IntersectionMatrix> relate(const Geometry* g) const;
534 
535  std::unique_ptr<IntersectionMatrix> relate(const Geometry& g) const;
536 
542  virtual bool equals(const Geometry* g) const;
543 
582  bool covers(const Geometry* g) const;
583 
614  bool
615  coveredBy(const Geometry* g) const
616  {
617  return g->covers(this);
618  }
619 
620 
622  virtual std::string toString() const;
623 
624  virtual std::string toText() const;
625 
630  std::unique_ptr<Geometry> buffer(double distance) const;
631 
639  std::unique_ptr<Geometry> buffer(double distance, int quadrantSegments) const;
640 
677  std::unique_ptr<Geometry> buffer(double distance, int quadrantSegments,
678  int endCapStyle) const;
679 
683  virtual std::unique_ptr<Geometry> convexHull() const;
684 
691  std::unique_ptr<Geometry> reverse() const { return std::unique_ptr<Geometry>(reverseImpl()); }
692 
702  std::unique_ptr<Geometry> intersection(const Geometry* other) const;
703 
713  std::unique_ptr<Geometry> Union(const Geometry* other) const;
714  // throw(IllegalArgumentException *, TopologyException *);
715 
733  Ptr Union() const;
734  // throw(IllegalArgumentException *, TopologyException *);
735 
746  std::unique_ptr<Geometry> difference(const Geometry* other) const;
747 
757  std::unique_ptr<Geometry> symDifference(const Geometry* other) const;
758 
765  virtual bool equalsExact(const Geometry* other, double tolerance = 0)
766  const = 0; // Abstract
767 
772  virtual bool equalsIdentical(const Geometry* other) const = 0;
773 
774  virtual void apply_rw(const CoordinateFilter* filter) = 0; //Abstract
775  virtual void apply_ro(CoordinateFilter* filter) const = 0; //Abstract
776  virtual void apply_rw(GeometryFilter* filter);
777  virtual void apply_ro(GeometryFilter* filter) const;
778  virtual void apply_rw(GeometryComponentFilter* filter);
779  virtual void apply_ro(GeometryComponentFilter* filter) const;
780 
789  virtual void apply_rw(CoordinateSequenceFilter& filter) = 0;
790 
797  virtual void apply_ro(CoordinateSequenceFilter& filter) const = 0;
798 
808  template <class T>
809  void
811  {
812  for(std::size_t i = 0, n = getNumGeometries(); i < n; ++i) {
813  f.filter(getGeometryN(i));
814  }
815  }
816 
822  virtual void normalize() = 0; //Abstract
823 
825  virtual int compareTo(const Geometry* geom) const;
826 
828  virtual double getArea() const;
829 
831  virtual double getLength() const;
832 
838  virtual double distance(const Geometry* g) const;
839 
840 
852  virtual bool isWithinDistance(const Geometry* geom,
853  double cDistance) const;
854 
864  virtual std::unique_ptr<Point> getCentroid() const;
865 
867  //
870  virtual bool getCentroid(CoordinateXY& ret) const;
871 
882  std::unique_ptr<Point> getInteriorPoint() const;
883 
889  virtual void geometryChanged();
890 
896  virtual void geometryChangedAction() = 0;
897 
898 protected:
900  virtual Geometry* cloneImpl() const = 0;
901 
903  virtual Geometry* reverseImpl() const = 0;
904 
906  template<typename T>
907  static bool hasNonEmptyElements(const std::vector<T>* geometries) {
908  return std::any_of(geometries->begin(), geometries->end(), [](const T& g) { return !g->isEmpty(); });
909  }
910 
912  static bool hasNullElements(const CoordinateSequence* list);
913 
915  template<typename T>
916  static bool hasNullElements(const std::vector<T>* geometries) {
917  return std::any_of(geometries->begin(), geometries->end(), [](const T& g) { return g == nullptr; });
918  }
919 
920 // static void reversePointOrder(CoordinateSequence* coordinates);
921 // static Coordinate& minCoordinate(CoordinateSequence* coordinates);
922 // static void scroll(CoordinateSequence* coordinates,Coordinate* firstCoordinate);
923 // static int indexOf(Coordinate* coordinate,CoordinateSequence* coordinates);
924 //
929  virtual bool isEquivalentClass(const Geometry* other) const;
930 
931  static void checkNotGeometryCollection(const Geometry* g);
932 
933  virtual int compareToSameClass(const Geometry* geom) const = 0; //Abstract
934 
935  template<typename T>
936  static int compare(const T& a, const T& b)
937  {
938  std::size_t i = 0;
939  std::size_t j = 0;
940  while(i < a.size() && j < b.size()) {
941  const auto& aGeom = *a[i];
942  const auto& bGeom = *b[j];
943 
944  int comparison = aGeom.compareTo(&bGeom);
945  if(comparison != 0) {
946  return comparison;
947  }
948 
949  i++;
950  j++;
951  }
952 
953  if(i < a.size()) {
954  return 1;
955  }
956 
957  if(j < b.size()) {
958  return -1;
959  }
960 
961  return 0;
962  }
963 
964  bool equal(const CoordinateXY& a, const CoordinateXY& b,
965  double tolerance) const;
966  int SRID;
967 
968  Geometry(const Geometry& geom);
969 
979  Geometry(const GeometryFactory* factory);
980 
981  template<typename T>
982  static std::vector<std::unique_ptr<Geometry>> toGeometryArray(std::vector<std::unique_ptr<T>> && v) {
983  static_assert(std::is_base_of<Geometry, T>::value, "");
984  std::vector<std::unique_ptr<Geometry>> gv(v.size());
985  for (std::size_t i = 0; i < v.size(); i++) {
986  gv[i] = std::move(v[i]);
987  }
988  return gv;
989  }
990 
991  static std::vector<std::unique_ptr<Geometry>> toGeometryArray(std::vector<std::unique_ptr<Geometry>> && v) {
992  return std::move(v);
993  }
994 
995 protected:
996 
997  virtual int getSortIndex() const = 0;
998 
999 
1000 private:
1001 
1002  class GEOS_DLL GeometryChangedFilter : public GeometryComponentFilter {
1003  public:
1004  void filter_rw(Geometry* geom) override;
1005  };
1006 
1007  static GeometryChangedFilter geometryChangedFilter;
1008 
1013  const GeometryFactory* _factory;
1014 
1015  void* _userData;
1016 };
1017 
1022 GEOS_DLL std::ostream& operator<< (std::ostream& os, const Geometry& geom);
1023 
1024 struct GEOS_DLL GeometryGreaterThen {
1025  bool operator()(const Geometry* first, const Geometry* second);
1026 };
1027 
1028 
1030 GEOS_DLL std::string geosversion();
1031 
1037 GEOS_DLL std::string jtsport();
1038 
1039 // We use this instead of std::pair<unique_ptr<Geometry>> because C++11
1040 // forbids that construct:
1041 // http://lwg.github.com/issues/lwg-closed.html#2068
1042 struct GeomPtrPair {
1043  typedef std::unique_ptr<Geometry> GeomPtr;
1044  GeomPtr first;
1045  GeomPtr second;
1046 };
1047 
1048 } // namespace geos::geom
1049 } // namespace geos
1050 
1051 #ifdef _MSC_VER
1052 #pragma warning(pop)
1053 #endif
1054 
Geometry classes support the concept of applying a coordinate filter to every coordinate in the Geome...
Definition: CoordinateFilter.h:43
Interface for classes which provide operations that can be applied to the coordinates in a Coordinate...
Definition: CoordinateSequenceFilter.h:55
The internal representation of a list of coordinates inside a Geometry.
Definition: CoordinateSequence.h:56
DimensionType
Definition: Dimension.h:29
@ A
Dimension value of a surface (2).
Definition: Dimension.h:46
@ L
Dimension value of a curve (1).
Definition: Dimension.h:43
@ P
Dimension value of a point (0).
Definition: Dimension.h:40
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition: Envelope.h:58
Definition: GeometryComponentFilter.h:41
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
Definition: GeometryFactory.h:70
Geometry classes support the concept of applying a Geometry filter to the Geometry.
Definition: GeometryFilter.h:45
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition: Geometry.h:196
virtual int getBoundaryDimension() const =0
Returns the dimension of this Geometrys inherent boundary.
std::unique_ptr< IntersectionMatrix > relate(const Geometry *g) const
Returns the DE-9IM intersection matrix for the two Geometrys.
virtual Geometry * cloneImpl() const =0
Make a deep-copy of this Geometry.
virtual bool equalsIdentical(const Geometry *other) const =0
Returns true if the two geometries are of the same type and their vertices corresponding by index are...
std::vector< Geometry * > NonConstVect
A vector of non-const Geometry pointers.
Definition: Geometry.h:206
void applyComponentFilter(T &f) const
Apply a filter to each component of this geometry. The filter is expected to provide a ....
Definition: Geometry.h:810
virtual int compareTo(const Geometry *geom) const
Comparator for sorting geometry.
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*.
virtual void apply_rw(CoordinateSequenceFilter &filter)=0
std::unique_ptr< 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...
virtual void geometryChangedAction()=0
Notifies this Geometry that its Coordinates have been changed by an external party.
const GeometryFactory * getFactory() const
Gets the factory which contains the context in which this geometry was created.
Definition: Geometry.h:226
virtual const Envelope * getEnvelopeInternal() const =0
Returns the minimum and maximum x and y values in this Geometry, or a null Envelope if this Geometry ...
virtual bool equalsExact(const Geometry *other, double tolerance=0) const =0
Returns true iff the two Geometrys are of the same type and their vertices corresponding by index are...
virtual bool isDimensionStrict(Dimension::DimensionType d) const
Checks whether this Geometry consists only of components having dimension d.
Definition: Geometry.h:369
virtual void normalize()=0
virtual void apply_ro(CoordinateSequenceFilter &filter) const =0
virtual bool intersects(const Geometry *g) const
Returns true if disjoint returns false.
virtual bool crosses(const Geometry *g) const
virtual GeometryTypeId getGeometryTypeId() const =0
Return an integer representation of this Geometry type.
virtual bool hasDimension(Dimension::DimensionType d) const
Checks whether any component of this geometry has dimension d.
Definition: Geometry.h:364
virtual std::unique_ptr< Geometry > getBoundary() const =0
Returns the boundary, or an empty geometry of appropriate dimension if this Geometry is empty.
virtual std::string getGeometryType() const =0
Return a string representation of this Geometry type.
const PrecisionModel * getPrecisionModel() const
Get the PrecisionModel used to create this Geometry.
virtual uint8_t getCoordinateDimension() const =0
Returns the coordinate dimension of this Geometry (2=XY, 3=XYZ or XYM, 4=XYZM).
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.
virtual double getLength() const
Returns the length of this Geometry.
virtual double distance(const Geometry *g) const
virtual bool getCentroid(CoordinateXY &ret) const
Computes the centroid of this Geometry as a Coordinate.
std::unique_ptr< Geometry > Ptr
An unique_ptr of Geometry.
Definition: Geometry.h:209
virtual Geometry * reverseImpl() const =0
Make a geometry with coordinates in reverse order.
virtual bool hasCurvedComponents() const
Returns whether the Geometry contains curved components.
virtual std::unique_ptr< Point > getCentroid() const
Computes the centroid of this Geometry.
virtual std::unique_ptr< CoordinateSequence > getCoordinates() const =0
Returns this Geometry vertices. Caller takes ownership of the returned object.
void * getUserData() const
Gets the user data object for this geometry, if any.
Definition: Geometry.h:257
virtual bool within(const Geometry *g) const
Returns true if the DE-9IM intersection matrix for the two Geometrys is T*F**F***.
virtual const CoordinateXY * getCoordinate() const =0
Returns a vertex of this Geometry, or NULL if this is the empty geometry.
virtual std::size_t getNumPoints() const =0
Returns the count of this Geometrys vertices.
virtual std::unique_ptr< Geometry > getEnvelope() const
Returns this Geometrys bounding box.
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:245
virtual bool isEmpty() const =0
Returns whether or not the set of points in this Geometry is empty.
std::unique_ptr< Geometry > buffer(double distance) const
std::unique_ptr< Geometry > intersection(const Geometry *other) const
Returns a Geometry representing the points shared by this Geometry and other.
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...
Geometry(const GeometryFactory *factory)
Construct a geometry with the given GeometryFactory.
std::vector< const Geometry * > ConstVect
A vector of const Geometry pointers.
Definition: Geometry.h:203
virtual int getSRID() const
Returns the ID of the Spatial Reference System used by the Geometry.
Definition: Geometry.h:273
virtual bool touches(const Geometry *other) const
Returns true if the DE-9IM intersection matrix for the two Geometrys is FT*******,...
std::unique_ptr< Geometry > Union(const Geometry *other) const
Returns a Geometry representing all the points in this Geometry and other.
virtual std::string toString() const
Returns the Well-known Text representation of this Geometry.
virtual bool isValid() const
Tests the validity of this Geometry.
virtual bool isSimple() const
Returns false if the Geometry not simple.
static bool hasNonEmptyElements(const std::vector< T > *geometries)
Returns true if the array contains any non-empty Geometrys.
Definition: Geometry.h:907
Ptr Union() const
Computes the union of all the elements of this geometry. Heterogeneous GeometryCollections are fully ...
std::unique_ptr< Geometry > reverse() const
Computes a new geometry which has all component coordinate sequences in reverse order (opposite orien...
Definition: Geometry.h:691
virtual bool disjoint(const Geometry *other) const
std::unique_ptr< 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...
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:615
std::unique_ptr< Geometry > difference(const Geometry *other) const
Returns a Geometry representing the points making up this Geometry that do not make up other.
std::unique_ptr< Geometry > clone() const
Make a deep-copy of this Geometry.
Definition: Geometry.h:212
virtual std::size_t getNumGeometries() const
Returns the number of geometries in this collection, or 1 if this is not a collection.
Definition: Geometry.h:326
virtual double getArea() const
Returns the area of this Geometry.
std::unique_ptr< 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...
std::unique_ptr< Point > getInteriorPoint() const
Computes an interior point of this Geometry.
virtual bool isRectangle() const
Polygon overrides to check for actual rectangle.
Definition: Geometry.h:355
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 const Geometry * getGeometryN(std::size_t) const
Returns a pointer to the nth Geometry in this collection (or self if this is not a collection)
Definition: Geometry.h:334
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)
virtual void geometryChanged()
Notifies this Geometry that its Coordinates have been changed by an external party (using a Coordinat...
virtual std::unique_ptr< Geometry > convexHull() const
Returns the smallest convex Polygon that contains all the points in the Geometry.
static bool hasNullElements(const std::vector< T > *geometries)
Returns true if the vector contains any null elements.
Definition: Geometry.h:916
virtual void setSRID(int newSRID)
Sets the ID of the Spatial Reference System used by the Geometry.
Definition: Geometry.h:282
Specifies the precision model of the Coordinate in a Geometry.
Definition: PrecisionModel.h:88
GeometryTypeId
Geometry types.
Definition: Geometry.h:73
@ GEOS_MULTILINESTRING
a collection of linestrings
Definition: Geometry.h:85
@ GEOS_LINEARRING
a linear ring (linestring with 1st point == last point)
Definition: Geometry.h:79
@ GEOS_GEOMETRYCOLLECTION
a collection of heterogeneus geometries
Definition: Geometry.h:89
@ GEOS_POINT
a point
Definition: Geometry.h:75
@ GEOS_LINESTRING
a linestring
Definition: Geometry.h:77
@ GEOS_POLYGON
a polygon
Definition: Geometry.h:81
@ GEOS_MULTIPOLYGON
a collection of polygons
Definition: Geometry.h:87
@ GEOS_MULTIPOINT
a collection of points
Definition: Geometry.h:83
std::string jtsport()
Return the version of JTS this GEOS release has been ported from.
std::string geosversion()
Return current GEOS version.
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25