QGIS API Documentation 3.29.0-Master (006c3c0232)
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
28class QgsFeaturePool;
29class QgsFeedback;
30
39class 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
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 ) const;
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
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:164
Line string geometry type, with support for z-dimension and m-values.
Definition: qgslinestring.h:45
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.
Definition: qgsvertexid.h:31