QGIS API Documentation  2.10.1-Pisa
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 <geos_c.h>
22 
23 class QgsLineStringV2;
24 class QgsPolygonV2;
25 
29 class CORE_EXPORT QgsGeos: public QgsGeometryEngine
30 {
31  public:
32  QgsGeos( const QgsAbstractGeometryV2* geometry );
33  ~QgsGeos();
34 
36  void geometryChanged() override;
37  void prepareGeometry() override;
38 
39  QgsAbstractGeometryV2* intersection( const QgsAbstractGeometryV2& geom ) const override;
40  QgsAbstractGeometryV2* difference( const QgsAbstractGeometryV2& geom ) const override;
41  QgsAbstractGeometryV2* combine( const QgsAbstractGeometryV2& geom ) const override;
43  QgsAbstractGeometryV2* symDifference( const QgsAbstractGeometryV2& geom ) const override;
44  QgsAbstractGeometryV2* buffer( double distance, int segments ) const override;
45  QgsAbstractGeometryV2* buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const override;
46  QgsAbstractGeometryV2* simplify( double tolerance ) const override;
47  QgsAbstractGeometryV2* interpolate( double distance ) const override;
48  bool centroid( QgsPointV2& pt ) const override;
49  bool pointOnSurface( QgsPointV2& pt ) const override;
50  QgsAbstractGeometryV2* convexHull() const override;
51  double distance( const QgsAbstractGeometryV2& geom ) const override;
52  bool intersects( const QgsAbstractGeometryV2& geom ) const override;
53  bool touches( const QgsAbstractGeometryV2& geom ) const override;
54  bool crosses( const QgsAbstractGeometryV2& geom ) const override;
55  bool within( const QgsAbstractGeometryV2& geom ) const override;
56  bool overlaps( const QgsAbstractGeometryV2& geom ) const override;
57  bool contains( const QgsAbstractGeometryV2& geom ) const override;
58  bool disjoint( const QgsAbstractGeometryV2& geom ) const override;
59  double area() const override;
60  double length() const override;
61  bool isValid() const override;
62  bool isEqual( const QgsAbstractGeometryV2& geom ) const override;
63  bool isEmpty() const override;
64 
71  int splitGeometry( const QgsLineStringV2& splitLine,
72  QList<QgsAbstractGeometryV2*>& newGeometries,
73  bool topological,
74  QList<QgsPointV2> &topologyTestPoints ) const override;
75 
76  QgsAbstractGeometryV2* offsetCurve( double distance, int segments, int joinStyle, double mitreLimit ) const override;
77  QgsAbstractGeometryV2* reshapeGeometry( const QgsLineStringV2& reshapeWithLine, int* errorCode ) const;
78 
79  static QgsAbstractGeometryV2* fromGeos( const GEOSGeometry* geos );
80  static QgsPolygonV2* fromGeosPolygon( const GEOSGeometry* geos );
81  static GEOSGeometry* asGeos( const QgsAbstractGeometryV2* geom );
82  static QgsPointV2 coordSeqPoint( const GEOSCoordSequence* cs, int i, bool hasZ, bool hasM );
83 
84  static GEOSContextHandle_t getGEOSHandler();
85 
86  private:
87  mutable GEOSGeometry* mGeos;
88  const GEOSPreparedGeometry* mGeosPrepared;
89 
90  enum Overlay
91  {
92  INTERSECTION,
93  DIFFERENCE,
94  UNION,
95  SYMDIFFERENCE
96  };
97 
98  enum Relation
99  {
100  INTERSECTS,
101  TOUCHES,
102  CROSSES,
103  WITHIN,
104  OVERLAPS,
105  CONTAINS,
106  DISJOINT
107  };
108 
109  //geos util functions
110  void cacheGeos() const;
111  QgsAbstractGeometryV2* overlay( const QgsAbstractGeometryV2& geom, Overlay op ) const;
112  bool relation( const QgsAbstractGeometryV2& geom, Relation r ) const;
113  static GEOSCoordSequence* createCoordinateSequence( const QgsCurveV2* curve );
114  static QgsLineStringV2* sequenceToLinestring( const GEOSGeometry* geos, bool hasZ, bool hasM );
115  static int numberOfGeometries( GEOSGeometry* g );
116  static GEOSGeometry* nodeGeometries( const GEOSGeometry *splitLine, const GEOSGeometry *geom );
117  int mergeGeometriesMultiTypeSplit( QVector<GEOSGeometry*>& splitResult ) const;
118  static GEOSGeometry* createGeosCollection( int typeId, const QVector<GEOSGeometry*>& geoms );
119 
120  static GEOSGeometry* createGeosPoint( const QgsAbstractGeometryV2* point, int coordDims );
121  static GEOSGeometry* createGeosLinestring( const QgsAbstractGeometryV2* curve );
122  static GEOSGeometry* createGeosPolygon( const QgsAbstractGeometryV2* poly );
123 
124  //utils for geometry split
125  int topologicalTestPointsSplit( const GEOSGeometry* splitLine, QList<QgsPointV2>& testPoints ) const;
126  GEOSGeometry* linePointDifference( GEOSGeometry* GEOSsplitPoint ) const;
127  int splitLinearGeometry( GEOSGeometry* splitLine, QList<QgsAbstractGeometryV2*>& newGeometries ) const;
128  int splitPolygonGeometry( GEOSGeometry* splitLine, QList<QgsAbstractGeometryV2*>& newGeometries ) const;
129 
130  //utils for reshape
131  static GEOSGeometry* reshapeLine( const GEOSGeometry* line, const GEOSGeometry* reshapeLineGeos );
132  static GEOSGeometry* reshapePolygon( const GEOSGeometry* polygon, const GEOSGeometry* reshapeLineGeos );
133  static int lineContainedInLine( const GEOSGeometry* line1, const GEOSGeometry* line2 );
134  static int pointContainedInLine( const GEOSGeometry* point, const GEOSGeometry* line );
135  static int geomDigits( const GEOSGeometry* geom );
136 };
137 
138 #endif // QGSGEOS_H
virtual QgsAbstractGeometryV2 * combine(const QgsAbstractGeometryV2 &geom) const =0
virtual double length() const =0
virtual bool disjoint(const QgsAbstractGeometryV2 &geom) const =0
virtual bool touches(const QgsAbstractGeometryV2 &geom) const =0
Abstract base class for all geometries.
virtual bool pointOnSurface(QgsPointV2 &pt) const =0
virtual void prepareGeometry()=0
Polygon geometry type.
Definition: qgspolygonv2.h:29
virtual double area() const =0
virtual int splitGeometry(const QgsLineStringV2 &splitLine, QList< QgsAbstractGeometryV2 * > &newGeometries, bool topological, QList< QgsPointV2 > &topologyTestPoints) const
virtual bool overlaps(const QgsAbstractGeometryV2 &geom) const =0
Line string geometry type.
Point geometry type.
Definition: qgspointv2.h:29
virtual QgsAbstractGeometryV2 * interpolate(double distance) const =0
virtual bool isEqual(const QgsAbstractGeometryV2 &geom) const =0
virtual bool contains(const QgsAbstractGeometryV2 &geom) const =0
virtual bool centroid(QgsPointV2 &pt) const =0
Does vector analysis using the geos library and handles import, export, exception handling*...
Definition: qgsgeos.h:29
virtual bool within(const QgsAbstractGeometryV2 &geom) const =0
virtual QgsAbstractGeometryV2 * difference(const QgsAbstractGeometryV2 &geom) const =0
virtual bool isValid() const =0
virtual QgsAbstractGeometryV2 * offsetCurve(double distance, int segments, int joinStyle, double mitreLimit) const =0
virtual void geometryChanged()=0
virtual QgsAbstractGeometryV2 * symDifference(const QgsAbstractGeometryV2 &geom) const =0
virtual QgsAbstractGeometryV2 * buffer(double distance, int segments) const =0
virtual double distance(const QgsAbstractGeometryV2 &geom) const =0
virtual bool isEmpty() const =0
virtual QgsAbstractGeometryV2 * simplify(double tolerance) const =0
Contains geometry relation and modification algorithms.
virtual QgsAbstractGeometryV2 * convexHull() const =0
Abstract base class for curved geometry type.
Definition: qgscurvev2.h:32
virtual bool crosses(const QgsAbstractGeometryV2 &geom) const =0
virtual QgsAbstractGeometryV2 * intersection(const QgsAbstractGeometryV2 &geom) const =0
virtual bool intersects(const QgsAbstractGeometryV2 &geom) const =0