QGIS API Documentation  3.21.0-Master (56b4176581)
qgsgeometrycheck.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsgeometrycheck.h
3  ---------------------
4  begin : September 2014
5  copyright : (C) 2014 by Sandro Mani / Sourcepole AG
6  email : smani at sourcepole dot ch
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 QGS_GEOMETRY_CHECK_H
17 #define QGS_GEOMETRY_CHECK_H
18 
19 #include <QApplication>
20 #include <limits>
21 #include <QStringList>
22 #include <QPointer>
23 
24 #include "qgis_analysis.h"
25 #include "qgsfeature.h"
26 #include "qgsvectorlayer.h"
27 #include "qgsgeometry.h"
30 #include "qgssettings.h"
31 
33 class QgsFeaturePool;
34 
91 class ANALYSIS_EXPORT QgsGeometryCheck
92 {
93  Q_GADGET
94 
95  public:
96 
104  struct ANALYSIS_EXPORT LayerFeatureIds
105  {
106  LayerFeatureIds() = default;
107  LayerFeatureIds( const QMap<QString, QgsFeatureIds> &idsIn ) SIP_SKIP;
108 
109  QMap<QString, QgsFeatureIds> ids SIP_SKIP;
110 
111 #ifndef SIP_RUN
112  QMap<QString, QgsFeatureIds> toMap() const
113  {
114  return ids;
115  }
116 
117  bool isEmpty() const
118  {
119  return ids.isEmpty();
120  }
121 #endif
122  };
123 
130  {
134  ChangeNode
135  };
136 
143  {
146  ChangeChanged
147  };
148 
155  {
158  LayerCheck
159  };
160 
164  enum Flag
165  {
166  AvailableInValidation = 1 << 1
167  };
168  Q_DECLARE_FLAGS( Flags, Flag )
169  Q_FLAG( Flags )
170 
171 
176  struct Change
177  {
178  Change() = default;
179 
184  : what( _what )
185  , type( _type )
186  , vidx( _vidx )
187  {}
188 
193 
198 
203 
204  // TODO c++20 - replace with = default
205  bool operator==( const QgsGeometryCheck::Change &other ) const
206  {
207  return what == other.what && type == other.type && vidx == other.vidx;
208  }
209 
210  bool operator!=( const QgsGeometryCheck::Change &other ) const
211  {
212  return !( *this == other );
213  }
214  };
215 
220  typedef QMap<QString, QMap<QgsFeatureId, QList<QgsGeometryCheck::Change> > > Changes;
221 
225  QgsGeometryCheck( const QgsGeometryCheckContext *context, const QVariantMap &configuration );
226  virtual ~QgsGeometryCheck() = default;
227 
233  virtual void prepare( const QgsGeometryCheckContext *context, const QVariantMap &configuration );
234 
235 #ifndef SIP_RUN
236 
241  template <class T>
242  T configurationValue( const QString &name, const QVariant &defaultValue = QVariant() )
243  {
244  return mConfiguration.value( name, QgsSettings().value( "/geometry_checker/" + id() + "/" + name, defaultValue ) ).value<T>();
245  }
246 #endif
247 
254  virtual bool isCompatible( QgsVectorLayer *layer ) const;
255 
261  virtual QList<QgsWkbTypes::GeometryType> compatibleGeometryTypes() const = 0;
262 
266  virtual QgsGeometryCheck::Flags flags() const;
267 
276  virtual void collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, QList<QgsGeometryCheckError *> &errors SIP_INOUT, QStringList &messages SIP_INOUT, QgsFeedback *feedback, const LayerFeatureIds &ids = QgsGeometryCheck::LayerFeatureIds() ) const = 0;
277 
285  virtual void fixError( const QMap<QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap<QString, int> &mergeAttributeIndices, Changes &changes SIP_INOUT ) const SIP_SKIP;
286 
292  virtual QList<QgsGeometryCheckResolutionMethod> availableResolutionMethods() const;
293 
301  Q_DECL_DEPRECATED virtual QStringList resolutionMethods() const SIP_DEPRECATED;
302 
308  virtual QString description() const = 0;
309 
315  virtual QString id() const = 0;
316 
322  virtual CheckType checkType() const = 0;
323 
329  const QgsGeometryCheckContext *context() const { return mContext; }
330 
331  protected:
332 
339  QMap<QString, QgsFeatureIds> allLayerFeatureIds( const QMap<QString, QgsFeaturePool *> &featurePools ) const SIP_SKIP;
340 
347  void replaceFeatureGeometryPart( const QMap<QString, QgsFeaturePool *> &featurePools, const QString &layerId, QgsFeature &feature, int partIdx, QgsAbstractGeometry *newPartGeom, Changes &changes ) const SIP_SKIP;
348 
355  void deleteFeatureGeometryPart( const QMap<QString, QgsFeaturePool *> &featurePools, const QString &layerId, QgsFeature &feature, int partIdx, Changes &changes ) const SIP_SKIP;
356 
363  void deleteFeatureGeometryRing( const QMap<QString, QgsFeaturePool *> &featurePools, const QString &layerId, QgsFeature &feature, int partIdx, int ringIdx, Changes &changes ) const SIP_SKIP;
364 
366  QVariantMap mConfiguration;
367 
374  double scaleFactor( const QPointer<QgsVectorLayer> &layer ) const SIP_SKIP;
375 };
376 
377 #endif // QGS_GEOMETRY_CHECK_H
Abstract base class for all geometries.
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.
This represents an error reported by a geometry check.
This class implements a geometry check.
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
virtual void collectErrors(const QMap< QString, QgsFeaturePool * > &featurePools, QList< QgsGeometryCheckError * > &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids=QgsGeometryCheck::LayerFeatureIds()) const =0
The main worker method.
T configurationValue(const QString &name, const QVariant &defaultValue=QVariant())
Returns the configuration value with the name, saved in the QGIS settings for this geometry check.
const QgsGeometryCheckContext * mContext
ChangeWhat
Description of a change to indicate at which level a change occurred.
@ ChangeRing
This change happens on ring level.
@ ChangeFeature
This change happens on feature level.
@ ChangePart
This change happens on part level.
Flag
Flags for geometry checks.
CheckType
The type of a check.
@ FeatureNodeCheck
The check controls individual nodes.
@ FeatureCheck
The check controls geometries as a whole.
virtual QList< QgsWkbTypes::GeometryType > compatibleGeometryTypes() const =0
A list of geometry types for which this check can be performed.
QVariantMap mConfiguration
ChangeType
Description of the type of a change.
@ ChangeAdded
Something has been added.
@ ChangeRemoved
Something has been removed.
virtual ~QgsGeometryCheck()=default
Represents a vector layer which manages a vector based data sets.
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_INOUT
Definition: qgis_sip.h:71
Descripts a change to fix a geometry.
Change(QgsGeometryCheck::ChangeWhat _what, QgsGeometryCheck::ChangeType _type, QgsVertexId _vidx=QgsVertexId())
Create a new Change.
QgsGeometryCheck::ChangeType type
What action this change performs.
QgsVertexId vidx
The index of the part / ring / vertex, depending on.
QgsGeometryCheck::ChangeWhat what
What level this change affects.
bool operator==(const QgsGeometryCheck::Change &other) const
bool operator!=(const QgsGeometryCheck::Change &other) const
A list of layers and feature ids for each of these layers.
QMap< QString, QgsFeatureIds > toMap() const
Utility class for identifying a unique vertex within a geometry.