QGIS API Documentation  3.21.0-Master (909859188c)
qgsgeometrycheckerutils.h
Go to the documentation of this file.
1 /***************************************************************************
2  * qgsgeometrycheckerutils.h *
3  * ------------------- *
4  * copyright : (C) 2014 by Sandro Mani / Sourcepole AG *
5  * email : [email protected] *
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #ifndef QGS_GEOMETRYCHECKERUTILS_H
18 #define QGS_GEOMETRYCHECKERUTILS_H
19 
20 #include "qgis_analysis.h"
21 #include "qgsfeature.h"
23 #include "geometry/qgspoint.h"
25 #include <qmath.h>
26 
27 class QgsGeometryEngine;
28 class QgsFeaturePool;
29 class QgsFeedback;
30 
39 class ANALYSIS_EXPORT QgsGeometryCheckerUtils
40 {
41  public:
42 
51  class ANALYSIS_EXPORT LayerFeature
52  {
53  public:
54 
61  LayerFeature( const QgsFeaturePool *pool, const QgsFeature &feature, const QgsGeometryCheckContext *context, bool useMapCrs );
62 
67  QgsFeature feature() const;
68 
72  QPointer<QgsVectorLayer> layer() const SIP_SKIP;
73 
77  QString layerId() const;
78 
84  QgsGeometry geometry() const;
85 
89  QString id() const;
90  bool operator==( const QgsGeometryCheckerUtils::LayerFeature &other ) const;
91  bool operator!=( const QgsGeometryCheckerUtils::LayerFeature &other ) const;
92 
96  bool useMapCrs() const;
97 
98  private:
99  const QgsFeaturePool *mFeaturePool;
100  QgsFeature mFeature;
101  QgsGeometry mGeometry;
102  bool mMapCrs;
103  };
104 
112  class ANALYSIS_EXPORT LayerFeatures
113  {
114  public:
115 #ifndef SIP_RUN
116 
120  LayerFeatures( const QMap<QString, QgsFeaturePool *> &featurePools,
121  const QMap<QString, QgsFeatureIds> &featureIds,
122  const QList<QgsWkbTypes::GeometryType> &geometryTypes,
123  QgsFeedback *feedback,
124  const QgsGeometryCheckContext *context,
125  bool useMapCrs = false );
126 
130  LayerFeatures( const QMap<QString, QgsFeaturePool *> &featurePools,
131  const QList<QString> &layerIds, const QgsRectangle &extent,
132  const QList<QgsWkbTypes::GeometryType> &geometryTypes,
133  const QgsGeometryCheckContext *context );
134 
142  class iterator
143  {
144  public:
145 
149  iterator( const QStringList::const_iterator &layerIt, const LayerFeatures *parent );
150 
154  iterator( const iterator &rh );
155  ~iterator();
156 
161  const iterator &operator++();
162 
167  iterator operator++( int n );
168 
173  bool operator!=( const iterator &other );
174 
175  private:
176  bool nextLayerFeature( bool begin );
177  bool nextLayer( bool begin );
178  bool nextFeature( bool begin );
179  QList<QString>::const_iterator mLayerIt;
180  QgsFeatureIds::const_iterator mFeatureIt;
181  const LayerFeatures *mParent = nullptr;
182  std::unique_ptr<QgsGeometryCheckerUtils::LayerFeature> mCurrentFeature;
183 
184  iterator &operator= ( const iterator & ) = delete;
185  };
186 
190  iterator begin() const;
191 
195  iterator end() const;
196 
197 #endif
198 
199  private:
200 #ifdef SIP_RUN
201  LayerFeatures();
202 #endif
203  QMap<QString, QgsFeaturePool *> mFeaturePools;
204  QMap<QString, QgsFeatureIds> mFeatureIds;
205  QList<QString> mLayerIds;
206  QgsRectangle mExtent;
207  QList<QgsWkbTypes::GeometryType> mGeometryTypes;
208  QgsFeedback *mFeedback = nullptr;
209  const QgsGeometryCheckContext *mContext = nullptr;
210  bool mUseMapCrs = true;
211  };
212 
213 #ifndef SIP_RUN
214 
215  static std::unique_ptr<QgsGeometryEngine> createGeomEngine( const QgsAbstractGeometry *geometry, double tolerance );
216 
217  static QgsAbstractGeometry *getGeomPart( QgsAbstractGeometry *geom, int partIdx );
218  static const QgsAbstractGeometry *getGeomPart( const QgsAbstractGeometry *geom, int partIdx );
219 
220  static QList <const QgsLineString *> polygonRings( const QgsPolygon *polygon );
221 
222  static void filter1DTypes( QgsAbstractGeometry *geom );
223 
228  static inline int polyLineSize( const QgsAbstractGeometry *geom, int iPart, int iRing, bool *isClosed = nullptr )
229  {
230  if ( !geom->isEmpty() )
231  {
232  const int nVerts = geom->vertexCount( iPart, iRing );
233  const QgsPoint front = geom->vertexAt( QgsVertexId( iPart, iRing, 0 ) );
234  const QgsPoint back = geom->vertexAt( QgsVertexId( iPart, iRing, nVerts - 1 ) );
235  const bool closed = back == front;
236  if ( isClosed )
237  *isClosed = closed;
238  return closed ? nVerts - 1 : nVerts;
239  }
240  else
241  {
242  if ( isClosed )
243  *isClosed = true;
244  return 0;
245  }
246  }
247 
248  static bool pointOnLine( const QgsPoint &p, const QgsLineString *line, double tol, bool excludeExtremities = false );
249 
250  static QList<QgsPoint> lineIntersections( const QgsLineString *line1, const QgsLineString *line2, double tol );
251 
252  static double sharedEdgeLength( const QgsAbstractGeometry *geom1, const QgsAbstractGeometry *geom2, double tol );
253 
261  static inline bool pointsFuzzyEqual( const QgsPointXY &p1, const QgsPointXY &p2, double tol )
262  {
263  double dx = p1.x() - p2.x(), dy = p1.y() - p2.y();
264  return ( dx * dx + dy * dy ) < tol * tol;
265  }
266 
267  static inline bool canDeleteVertex( const QgsAbstractGeometry *geom, int iPart, int iRing )
268  {
269  const int nVerts = geom->vertexCount( iPart, iRing );
270  const QgsPoint front = geom->vertexAt( QgsVertexId( iPart, iRing, 0 ) );
271  const QgsPoint back = geom->vertexAt( QgsVertexId( iPart, iRing, nVerts - 1 ) );
272  const bool closed = back == front;
273  return closed ? nVerts > 4 : nVerts > 2;
274  }
275 
276 #endif
277 
278 }; // QgsGeometryCheckerUtils
279 
280 #endif // QGS_GEOMETRYCHECKERUTILS_H
Abstract base class for all geometries.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual bool isEmpty() const
Returns true if the geometry is empty.
A feature pool is based on a vector layer and caches features.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
Base configuration for geometry checks.
A layer feature combination to uniquely identify and access a feature in a set of layers.
An iterator over all features in a QgsGeometryCheckerUtils::LayerFeatures.
Contains a set of layers and feature ids in those layers to pass to a geometry check.
Contains utilities required for geometry checks.
static bool canDeleteVertex(const QgsAbstractGeometry *geom, int iPart, int iRing)
static int polyLineSize(const QgsAbstractGeometry *geom, int iPart, int iRing, bool *isClosed=nullptr)
Returns the number of points in a polyline, accounting for duplicate start and end point if the polyl...
static bool pointsFuzzyEqual(const QgsPointXY &p1, const QgsPointXY &p2, double tol)
Determine whether two points are equal up to the specified tolerance.
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:124
Line string geometry type, with support for z-dimension and m-values.
Definition: qgslinestring.h:44
A class to represent a 2D point.
Definition: qgspointxy.h:59
double y
Definition: qgspointxy.h:63
Q_GADGET double x
Definition: qgspointxy.h:62
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
Polygon geometry type.
Definition: qgspolygon.h:34
A rectangle specified with double values.
Definition: qgsrectangle.h:42
#define SIP_SKIP
Definition: qgis_sip.h:126
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
bool operator!=(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
QgsMargins operator*(const QgsMargins &margins, double factor)
Returns a QgsMargins object that is formed by multiplying each component of the given margins by fact...
Definition: qgsmargins.h:242
Utility class for identifying a unique vertex within a geometry.