QGIS API Documentation  2.14.0-Essen
qgsgeos.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsgeos.h
3  -------------------------------------------------------------------
4 Date : 22 Sept 2014
5 Copyright : (C) 2014 by Marco Hugentobler
6 email : marco.hugentobler at sourcepole dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #ifndef QGSGEOS_H
17 #define QGSGEOS_H
18 
19 #include "qgsgeometryengine.h"
20 #include "qgspointv2.h"
21 #include "qgsgeometry.h"
22 #include <geos_c.h>
23 
24 class QgsLineStringV2;
25 class QgsPolygonV2;
26 
31 class CORE_EXPORT QgsGeos: public QgsGeometryEngine
32 {
33  public:
38  QgsGeos( const QgsAbstractGeometryV2* geometry, double precision = 0 );
39  ~QgsGeos();
40 
42  void geometryChanged() override;
43  void prepareGeometry() override;
44 
45  QgsAbstractGeometryV2* intersection( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
46  QgsAbstractGeometryV2* difference( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
47  QgsAbstractGeometryV2* combine( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
48  QgsAbstractGeometryV2* combine( const QList< QgsAbstractGeometryV2*>&, QString* errorMsg = nullptr ) const override;
49  QgsAbstractGeometryV2* symDifference( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
50  QgsAbstractGeometryV2* buffer( double distance, int segments, QString* errorMsg = nullptr ) const override;
51  QgsAbstractGeometryV2* buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit, QString* errorMsg = nullptr ) const override;
52  QgsAbstractGeometryV2* simplify( double tolerance, QString* errorMsg = nullptr ) const override;
53  QgsAbstractGeometryV2* interpolate( double distance, QString* errorMsg = nullptr ) const override;
54  QgsAbstractGeometryV2* envelope( QString* errorMsg = nullptr ) const override;
55  bool centroid( QgsPointV2& pt, QString* errorMsg = nullptr ) const override;
56  bool pointOnSurface( QgsPointV2& pt, QString* errorMsg = nullptr ) const override;
57  QgsAbstractGeometryV2* convexHull( QString* errorMsg = nullptr ) const override;
58  double distance( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
59  bool intersects( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
60  bool touches( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
61  bool crosses( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
62  bool within( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
63  bool overlaps( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
64  bool contains( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
65  bool disjoint( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
66  QString relate( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
67  bool relatePattern( const QgsAbstractGeometryV2& geom, const QString& pattern, QString* errorMsg = nullptr ) const override;
68  double area( QString* errorMsg = nullptr ) const override;
69  double length( QString* errorMsg = nullptr ) const override;
70  bool isValid( QString* errorMsg = nullptr ) const override;
71  bool isEqual( const QgsAbstractGeometryV2& geom, QString* errorMsg = nullptr ) const override;
72  bool isEmpty( QString* errorMsg = nullptr ) const override;
73 
81  int splitGeometry( const QgsLineStringV2& splitLine,
82  QList<QgsAbstractGeometryV2*>& newGeometries,
83  bool topological,
84  QgsPointSequenceV2 &topologyTestPoints,
85  QString* errorMsg = nullptr ) const override;
86 
87  QgsAbstractGeometryV2* offsetCurve( double distance, int segments, int joinStyle, double mitreLimit, QString* errorMsg = nullptr ) const override;
88  QgsAbstractGeometryV2* reshapeGeometry( const QgsLineStringV2& reshapeWithLine, int* errorCode, QString* errorMsg = nullptr ) const;
89 
94  QgsGeometry closestPoint( const QgsGeometry& other, QString* errorMsg = nullptr ) const;
95 
100  QgsGeometry shortestLine( const QgsGeometry& other, QString* errorMsg = nullptr ) const;
101 
105  static QgsAbstractGeometryV2* fromGeos( const GEOSGeometry* geos );
106  static QgsPolygonV2* fromGeosPolygon( const GEOSGeometry* geos );
107  static GEOSGeometry* asGeos( const QgsAbstractGeometryV2* geom , double precision = 0 );
108  static QgsPointV2 coordSeqPoint( const GEOSCoordSequence* cs, int i, bool hasZ, bool hasM );
109 
110  static GEOSContextHandle_t getGEOSHandler();
111 
112  private:
113  mutable GEOSGeometry* mGeos;
114  const GEOSPreparedGeometry* mGeosPrepared;
115  double mPrecision;
116 
117  enum Overlay
118  {
119  INTERSECTION,
120  DIFFERENCE,
121  UNION,
122  SYMDIFFERENCE
123  };
124 
125  enum Relation
126  {
127  INTERSECTS,
128  TOUCHES,
129  CROSSES,
130  WITHIN,
131  OVERLAPS,
132  CONTAINS,
133  DISJOINT
134  };
135 
136  //geos util functions
137  void cacheGeos() const;
138  QgsAbstractGeometryV2* overlay( const QgsAbstractGeometryV2& geom, Overlay op, QString* errorMsg = nullptr ) const;
139  bool relation( const QgsAbstractGeometryV2& geom, Relation r, QString* errorMsg = nullptr ) const;
140  static GEOSCoordSequence* createCoordinateSequence( const QgsCurveV2* curve , double precision );
141  static QgsLineStringV2* sequenceToLinestring( const GEOSGeometry* geos, bool hasZ, bool hasM );
142  static int numberOfGeometries( GEOSGeometry* g );
143  static GEOSGeometry* nodeGeometries( const GEOSGeometry *splitLine, const GEOSGeometry *geom );
144  int mergeGeometriesMultiTypeSplit( QVector<GEOSGeometry*>& splitResult ) const;
145 
148  static GEOSGeometry* createGeosCollection( int typeId, const QVector<GEOSGeometry*>& geoms );
149 
150  static GEOSGeometry* createGeosPoint( const QgsAbstractGeometryV2* point, int coordDims , double precision );
151  static GEOSGeometry* createGeosLinestring( const QgsAbstractGeometryV2* curve, double precision );
152  static GEOSGeometry* createGeosPolygon( const QgsAbstractGeometryV2* poly, double precision );
153 
154  //utils for geometry split
155  int topologicalTestPointsSplit( const GEOSGeometry* splitLine, QgsPointSequenceV2 &testPoints, QString* errorMsg = nullptr ) const;
156  GEOSGeometry* linePointDifference( GEOSGeometry* GEOSsplitPoint ) const;
157  int splitLinearGeometry( GEOSGeometry* splitLine, QList<QgsAbstractGeometryV2*>& newGeometries ) const;
158  int splitPolygonGeometry( GEOSGeometry* splitLine, QList<QgsAbstractGeometryV2*>& newGeometries ) const;
159 
160  //utils for reshape
161  static GEOSGeometry* reshapeLine( const GEOSGeometry* line, const GEOSGeometry* reshapeLineGeos, double precision );
162  static GEOSGeometry* reshapePolygon( const GEOSGeometry* polygon, const GEOSGeometry* reshapeLineGeos , double precision );
163  static int lineContainedInLine( const GEOSGeometry* line1, const GEOSGeometry* line2 );
164  static int pointContainedInLine( const GEOSGeometry* point, const GEOSGeometry* line );
165  static int geomDigits( const GEOSGeometry* geom );
166 };
167 
169 
170 class GEOSException
171 {
172  public:
173  explicit GEOSException( const QString& theMsg )
174  {
175  if ( theMsg == "Unknown exception thrown" && lastMsg().isNull() )
176  {
177  msg = theMsg;
178  }
179  else
180  {
181  msg = theMsg;
182  lastMsg() = msg;
183  }
184  }
185 
186  // copy constructor
187  GEOSException( const GEOSException &rhs )
188  {
189  *this = rhs;
190  }
191 
192  ~GEOSException()
193  {
194  if ( lastMsg() == msg )
195  lastMsg() = QString::null;
196  }
197 
198  QString what()
199  {
200  return msg;
201  }
202 
203  private:
204  QString msg;
205  static QString& lastMsg() { static QString _lastMsg; return _lastMsg; }
206 };
207 
209 
210 #endif // QGSGEOS_H
virtual QgsAbstractGeometryV2 * symDifference(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometryV2 * difference(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual int splitGeometry(const QgsLineStringV2 &splitLine, QList< QgsAbstractGeometryV2 * > &newGeometries, bool topological, QgsPointSequenceV2 &topologyTestPoints, QString *errorMsg=nullptr) const
virtual bool intersects(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual bool isEqual(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual double distance(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual bool touches(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
Abstract base class for all geometries.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:76
virtual double length(QString *errorMsg=nullptr) const =0
virtual bool overlaps(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual void prepareGeometry()=0
virtual bool isEmpty(QString *errorMsg) const =0
virtual bool centroid(QgsPointV2 &pt, QString *errorMsg=nullptr) const =0
Polygon geometry type.
Definition: qgspolygonv2.h:29
virtual QgsAbstractGeometryV2 * buffer(double distance, int segments, QString *errorMsg=nullptr) const =0
Line string geometry type, with support for z-dimension and m-values.
virtual QgsAbstractGeometryV2 * offsetCurve(double distance, int segments, int joinStyle, double mitreLimit, QString *errorMsg=nullptr) const =0
virtual QString relate(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
Returns the Dimensional Extended 9 Intersection Model (DE-9IM) representation of the relationship bet...
Point geometry type, with support for z-dimension and m-values.
Definition: qgspointv2.h:34
virtual bool crosses(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual bool contains(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual double area(QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometryV2 * simplify(double tolerance, QString *errorMsg=nullptr) const =0
Does vector analysis using the geos library and handles import, export, exception handling*...
Definition: qgsgeos.h:31
virtual QgsAbstractGeometryV2 * convexHull(QString *errorMsg=nullptr) const =0
virtual void geometryChanged()=0
virtual QgsAbstractGeometryV2 * intersection(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual bool relatePattern(const QgsAbstractGeometryV2 &geom, const QString &pattern, QString *errorMsg=nullptr) const =0
Tests whether two geometries are related by a specified Dimensional Extended 9 Intersection Model (DE...
virtual bool isValid(QString *errorMsg=nullptr) const =0
virtual bool pointOnSurface(QgsPointV2 &pt, QString *errorMsg=nullptr) const =0
Contains geometry relation and modification algorithms.
virtual bool within(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
Abstract base class for curved geometry type.
Definition: qgscurvev2.h:32
virtual bool disjoint(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometryV2 * combine(const QgsAbstractGeometryV2 &geom, QString *errorMsg=nullptr) const =0
bool isNull(const QVariant &v)
virtual QgsAbstractGeometryV2 * interpolate(double distance, QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometryV2 * envelope(QString *errorMsg=nullptr) const =0