Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgssinglegeometrycheck.h 3 : : -------------------------------------- 4 : : Date : 6.9.2018 5 : : Copyright : (C) 2018 by Matthias Kuhn 6 : : email : matthias@opengis.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 QGSSINGLEGEOMETRYCHECK_H 17 : : #define QGSSINGLEGEOMETRYCHECK_H 18 : : 19 : : #include <QList> 20 : : #include <QCoreApplication> 21 : : 22 : : #include "qgsgeometry.h" 23 : : #include "qgsgeometrycheck.h" 24 : : #include "qgsgeometrycheckerror.h" 25 : : 26 : : #include "qgis_analysis.h" 27 : : 28 : : class QgsFeature; 29 : : class QgsSingleGeometryCheck; 30 : : 31 : : /** 32 : : * \ingroup analysis 33 : : * 34 : : * \brief An error from a QgsSingleGeometryCheck. 35 : : * 36 : : * \note This class is a technology preview and unstable API. 37 : : * \since QGIS 3.4 38 : : */ 39 : : class ANALYSIS_EXPORT QgsSingleGeometryCheckError 40 : : { 41 : : public: 42 : : 43 : : /** 44 : : * Creates a new single geometry check error. 45 : : */ 46 : 40 : QgsSingleGeometryCheckError( const QgsSingleGeometryCheck *check, const QgsGeometry &geometry, const QgsGeometry &errorLocation, const QgsVertexId &vertexId = QgsVertexId() ) 47 : 40 : : mCheck( check ) 48 : 40 : , mGeometry( geometry ) 49 : 40 : , mErrorLocation( errorLocation ) 50 : 40 : , mVertexId( vertexId ) 51 : 40 : {} 52 : : 53 : 0 : virtual ~QgsSingleGeometryCheckError() = default; 54 : : 55 : : /** 56 : : * Update this error with the information from \a other. 57 : : * Will be used to update existing errors whenever they are re-checked. 58 : : */ 59 : : virtual void update( const QgsSingleGeometryCheckError *other ); 60 : : 61 : : /** 62 : : * Check if this error is equal to \a other. 63 : : * Is reimplemented by subclasses with additional information, comparison 64 : : * of base information is done in parent class. 65 : : */ 66 : : virtual bool isEqual( const QgsSingleGeometryCheckError *other ) const; 67 : : 68 : : /** 69 : : * Apply a list of \a changes. 70 : : */ 71 : : virtual bool handleChanges( const QList<QgsGeometryCheck::Change> &changes ) SIP_SKIP; 72 : : 73 : : /** 74 : : * A human readable description of this error. 75 : : */ 76 : : virtual QString description() const; 77 : : 78 : : /** 79 : : * The check that created this error. 80 : : * 81 : : * \since QGIS 3.4 82 : : */ 83 : : const QgsSingleGeometryCheck *check() const; 84 : : 85 : : /** 86 : : * The exact location of the error. 87 : : * 88 : : * \since QGIS 3.4 89 : : */ 90 : : QgsGeometry errorLocation() const; 91 : : 92 : : /** 93 : : * The vertex id of the error. May be invalid depending on the check. 94 : : * 95 : : * \since QGIS 3.4 96 : : */ 97 : : QgsVertexId vertexId() const; 98 : : 99 : : protected: 100 : : const QgsSingleGeometryCheck *mCheck = nullptr; 101 : : QgsGeometry mGeometry; 102 : : QgsGeometry mErrorLocation; 103 : : QgsVertexId mVertexId; 104 : : }; 105 : : 106 : : /** 107 : : * \ingroup analysis 108 : : * 109 : : * \brief Wraps a QgsSingleGeometryError into a standard QgsGeometryCheckError. 110 : : * The single error can be obtained via singleError. 111 : : * 112 : : * \note This class is a technology preview and unstable API. 113 : : * \since QGIS 3.4 114 : : */ 115 : 0 : class ANALYSIS_EXPORT QgsGeometryCheckErrorSingle : public QgsGeometryCheckError 116 : : { 117 : : public: 118 : : 119 : : /** 120 : : * Creates a new error for a QgsSingleGeometryCheck. 121 : : */ 122 : : QgsGeometryCheckErrorSingle( QgsSingleGeometryCheckError *singleError, const QgsGeometryCheckerUtils::LayerFeature &layerFeature ); 123 : : 124 : : /** 125 : : * The underlying single error. 126 : : */ 127 : : QgsSingleGeometryCheckError *singleError() const; 128 : : 129 : : bool handleChanges( const QgsGeometryCheck::Changes &changes ) override SIP_SKIP; 130 : : 131 : : private: 132 : : #ifdef SIP_RUN 133 : : const QgsGeometryCheckErrorSingle &operator=( const QgsGeometryCheckErrorSingle & ); 134 : : #endif 135 : : 136 : : QgsSingleGeometryCheckError *mError = nullptr; 137 : : }; 138 : : 139 : : /** 140 : : * \ingroup analysis 141 : : * 142 : : * \brief Base class for geometry checks for a single geometry without any context of the layer or other layers in the project. 143 : : * Classic examples are validity checks like self-intersection. 144 : : * 145 : : * Subclasses need to implement the processGeometry method. 146 : : * 147 : : * \since QGIS 3.4 148 : : */ 149 : 4 : class ANALYSIS_EXPORT QgsSingleGeometryCheck : public QgsGeometryCheck 150 : : { 151 : : public: 152 : : 153 : : /** 154 : : * Creates a new single geometry check. 155 : : */ 156 : 4 : QgsSingleGeometryCheck( const QgsGeometryCheckContext *context, 157 : : const QVariantMap &configuration ) 158 : 4 : : QgsGeometryCheck( context, configuration ) 159 : 8 : {} 160 : : 161 : : void collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, 162 : : QList<QgsGeometryCheckError *> &errors, 163 : : QStringList &messages, 164 : : QgsFeedback *feedback = nullptr, 165 : : const QgsGeometryCheck::LayerFeatureIds &ids = QgsGeometryCheck::LayerFeatureIds() ) const FINAL; 166 : : 167 : : /** 168 : : * Check the \a geometry for errors. It may make use of \a configuration options. 169 : : * 170 : : * Returns a list of QgsSingleGeometryCheckErrors, ownership is transferred to the caller. 171 : : * An empty list is returned for geometries without errors. 172 : : * 173 : : * \since QGIS 3.4 174 : : */ 175 : : virtual QList<QgsSingleGeometryCheckError *> processGeometry( const QgsGeometry &geometry ) const = 0; 176 : : 177 : : private: 178 : : 179 : : /** 180 : : * Converts a QgsSingleGeometryCheckError to a QgsGeometryCheckErrorSingle. 181 : : * 182 : : * \since QGIS 3.4 183 : : */ 184 : : QgsGeometryCheckErrorSingle *convertToGeometryCheckError( QgsSingleGeometryCheckError *singleGeometryCheckError, const QgsGeometryCheckerUtils::LayerFeature &layerFeature ) const; 185 : : 186 : : }; 187 : : 188 : : #endif // QGSSINGLEGEOMETRYCHECK_H