QGIS API Documentation 3.39.0-Master (3aed037ce22)
Loading...
Searching...
No Matches
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"
22#include "qgsabstractgeometry.h"
23#include "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<Qgis::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<Qgis::GeometryType> &geometryTypes,
133 const QgsGeometryCheckContext *context );
134
143 {
144 public:
145
149 iterator( const QStringList::const_iterator &layerIt, const LayerFeatures *parent );
150
151 iterator( const iterator &rh );
152 ~iterator();
153
158 const iterator &operator++();
159
164 iterator operator++( int n );
165
170 bool operator!=( const iterator &other ) const;
171
172 private:
173 bool nextLayerFeature( bool begin );
174 bool nextLayer( bool begin );
175 bool nextFeature( bool begin );
176 QList<QString>::const_iterator mLayerIt;
177 QgsFeatureIds::const_iterator mFeatureIt;
178 const LayerFeatures *mParent = nullptr;
179 std::unique_ptr<QgsGeometryCheckerUtils::LayerFeature> mCurrentFeature;
180
181 iterator &operator= ( const iterator & ) = delete;
182 };
183
187 iterator begin() const;
188
192 iterator end() const;
193
194#endif
195
196 private:
197#ifdef SIP_RUN
199#endif
200 QMap<QString, QgsFeaturePool *> mFeaturePools;
201 QMap<QString, QgsFeatureIds> mFeatureIds;
202 QList<QString> mLayerIds;
203 QgsRectangle mExtent;
204 QList<Qgis::GeometryType> mGeometryTypes;
205 QgsFeedback *mFeedback = nullptr;
206 const QgsGeometryCheckContext *mContext = nullptr;
207 bool mUseMapCrs = true;
208 };
209
210#ifndef SIP_RUN
211
212 static std::unique_ptr<QgsGeometryEngine> createGeomEngine( const QgsAbstractGeometry *geometry, double tolerance );
213
214 static QgsAbstractGeometry *getGeomPart( QgsAbstractGeometry *geom, int partIdx );
215 static const QgsAbstractGeometry *getGeomPart( const QgsAbstractGeometry *geom, int partIdx );
216
217 static QList <const QgsLineString *> polygonRings( const QgsPolygon *polygon );
218
219 static void filter1DTypes( QgsAbstractGeometry *geom );
220
225 static inline int polyLineSize( const QgsAbstractGeometry *geom, int iPart, int iRing, bool *isClosed = nullptr )
226 {
227 if ( !geom->isEmpty() )
228 {
229 const int nVerts = geom->vertexCount( iPart, iRing );
230 const QgsPoint front = geom->vertexAt( QgsVertexId( iPart, iRing, 0 ) );
231 const QgsPoint back = geom->vertexAt( QgsVertexId( iPart, iRing, nVerts - 1 ) );
232 const bool closed = back == front;
233 if ( isClosed )
234 *isClosed = closed;
235 return closed ? nVerts - 1 : nVerts;
236 }
237 else
238 {
239 if ( isClosed )
240 *isClosed = true;
241 return 0;
242 }
243 }
244
245 static bool pointOnLine( const QgsPoint &p, const QgsLineString *line, double tol, bool excludeExtremities = false );
246
247 static QList<QgsPoint> lineIntersections( const QgsLineString *line1, const QgsLineString *line2, double tol );
248
249 static double sharedEdgeLength( const QgsAbstractGeometry *geom1, const QgsAbstractGeometry *geom2, double tol );
250
251 static inline bool canDeleteVertex( const QgsAbstractGeometry *geom, int iPart, int iRing )
252 {
253 const int nVerts = geom->vertexCount( iPart, iRing );
254 const QgsPoint front = geom->vertexAt( QgsVertexId( iPart, iRing, 0 ) );
255 const QgsPoint back = geom->vertexAt( QgsVertexId( iPart, iRing, nVerts - 1 ) );
256 const bool closed = back == front;
257 return closed ? nVerts > 4 : nVerts > 2;
258 }
259
260#endif
261
262}; // QgsGeometryCheckerUtils
263
264#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:58
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
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...
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.
Line string geometry type, with support for z-dimension and m-values.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
Polygon geometry type.
Definition qgspolygon.h:33
A rectangle specified with double values.
#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:241
Utility class for identifying a unique vertex within a geometry.
Definition qgsvertexid.h:30