Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgeometrygapcheck.h 3 : : --------------------- 4 : : begin : September 2015 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 : : #define SIP_NO_FILE 17 : : 18 : : #ifndef QGS_GEOMETRY_GAP_CHECK_H 19 : : #define QGS_GEOMETRY_GAP_CHECK_H 20 : : 21 : : #include "qgsgeometrycheck.h" 22 : : #include "qgsgeometrycheckerror.h" 23 : : #include "qgsfeatureid.h" 24 : : 25 : : /** 26 : : * \ingroup analysis 27 : : * \brief An error produced by a QgsGeometryGapCheck. 28 : : * 29 : : * \since QGIS 3.4 30 : : */ 31 : 18 : class ANALYSIS_EXPORT QgsGeometryGapCheckError : public QgsGeometryCheckError 32 : : { 33 : : public: 34 : : 35 : : /** 36 : : * Create a new gap check error produced by \a check on the layer \a layerId. 37 : : * The \a geometry of the gap needs to be in map coordinates. 38 : : * The \a neighbors are a map of layer ids and feature ids. 39 : : * The \a area of the gap in map units and the bounding box of the gap in map units too. 40 : : */ 41 : 19 : QgsGeometryGapCheckError( const QgsGeometryCheck *check, 42 : : const QString &layerId, 43 : : const QgsGeometry &geometry, 44 : : const QMap<QString, QgsFeatureIds> &neighbors, 45 : : double area, 46 : : const QgsRectangle &gapAreaBBox, 47 : : const QgsRectangle &contextArea ) 48 : 19 : : QgsGeometryCheckError( check, layerId, FID_NULL, geometry, geometry.constGet()->centroid(), QgsVertexId(), area, ValueArea ) 49 : 19 : , mNeighbors( neighbors ) 50 : 19 : , mGapAreaBBox( gapAreaBBox ) 51 : 19 : , mContextBoundingBox( contextArea ) 52 : 38 : { 53 : 19 : } 54 : : 55 : : QgsRectangle contextBoundingBox() const override; 56 : : 57 : : /** 58 : : * A map of layers and feature ids of the neighbors of the gap. 59 : : */ 60 : 4 : const QMap<QString, QgsFeatureIds> &neighbors() const { return mNeighbors; } 61 : : 62 : : bool isEqual( QgsGeometryCheckError *other ) const override; 63 : : 64 : : bool closeMatch( QgsGeometryCheckError *other ) const override; 65 : : 66 : : void update( const QgsGeometryCheckError *other ) override; 67 : : 68 : : bool handleChanges( const QgsGeometryCheck::Changes & /*changes*/ ) override; 69 : : 70 : : QgsRectangle affectedAreaBBox() const override; 71 : : 72 : : QMap<QString, QgsFeatureIds > involvedFeatures() const override; 73 : : 74 : : QIcon icon() const override; 75 : : 76 : : private: 77 : : QMap<QString, QgsFeatureIds> mNeighbors; 78 : : QgsRectangle mGapAreaBBox; 79 : : QgsRectangle mContextBoundingBox; 80 : : }; 81 : : 82 : : 83 : : /** 84 : : * \ingroup analysis 85 : : * \brief Checks for gaps between neighbouring polygons. 86 : : * 87 : : * \since QGIS 3.4 88 : : */ 89 : 3 : class ANALYSIS_EXPORT QgsGeometryGapCheck : public QgsGeometryCheck 90 : : { 91 : : Q_GADGET 92 : 26 : Q_DECLARE_TR_FUNCTIONS( QgsGeometryGapCheck ) 93 : : 94 : : public: 95 : : //! Resolution methods for geometry gap checks 96 : : enum ResolutionMethod 97 : : { 98 : : MergeLongestEdge, //!< Merge the gap with the polygon with the longest shared edge. 99 : : NoChange, //!< Do not handle the error. 100 : : AddToAllowedGaps, //!< Add gap geometry to allowed gaps layer 101 : : CreateNewFeature, //!< Create a new feature with the gap geometry 102 : : MergeLargestArea, //!< Merge with neighbouring polygon with largest area 103 : : }; 104 : 6 : Q_ENUM( ResolutionMethod ) 105 : : 106 : : /** 107 : : * The \a configuration accepts a "gapThreshold" key which specifies 108 : : * the maximum gap size in squared map units. Any gaps which are larger 109 : : * than this area are accepted. If "gapThreshold" is set to 0, the check 110 : : * is disabled. 111 : : */ 112 : : explicit QgsGeometryGapCheck( const QgsGeometryCheckContext *context, const QVariantMap &configuration ); 113 : : 114 : : void prepare( const QgsGeometryCheckContext *context, const QVariantMap &configuration ) override; 115 : : 116 : 26 : QList<QgsWkbTypes::GeometryType> compatibleGeometryTypes() const override { return factoryCompatibleGeometryTypes(); } 117 : : void collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, QList<QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids = LayerFeatureIds() ) const override; 118 : : void fixError( const QMap<QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap<QString, int> &mergeAttributeIndices, Changes &changes ) const override; 119 : : Q_DECL_DEPRECATED QStringList resolutionMethods() const override; 120 : : 121 : : QList<QgsGeometryCheckResolutionMethod> availableResolutionMethods() const override; 122 : : 123 : : QString description() const override; 124 : : QString id() const override; 125 : : QgsGeometryCheck::Flags flags() const override; 126 : 0 : QgsGeometryCheck::CheckType checkType() const override { return factoryCheckType(); } 127 : : 128 : : ///@cond private 129 : : static QString factoryDescription() SIP_SKIP; 130 : : static QString factoryId() SIP_SKIP; 131 : : static QgsGeometryCheck::Flags factoryFlags() SIP_SKIP; 132 : : static QList<QgsWkbTypes::GeometryType> factoryCompatibleGeometryTypes() SIP_SKIP; 133 : : static bool factoryIsCompatible( QgsVectorLayer *layer ) SIP_SKIP; 134 : : static QgsGeometryCheck::CheckType factoryCheckType() SIP_SKIP; 135 : : ///@endcond private 136 : : 137 : : private: 138 : : enum Condition 139 : : { 140 : : LongestSharedEdge, 141 : : LargestArea 142 : : }; 143 : : 144 : : bool mergeWithNeighbor( const QMap<QString, QgsFeaturePool *> &featurePools, 145 : : QgsGeometryGapCheckError *err, Changes &changes, QString &errMsg, Condition condition ) const; 146 : : 147 : : const double mGapThresholdMapUnits; 148 : : QgsWeakMapLayerPointer mAllowedGapsLayer; 149 : : std::unique_ptr<QgsVectorLayerFeatureSource> mAllowedGapsSource; 150 : : double mAllowedGapsBuffer = 0; 151 : : 152 : : }; 153 : : 154 : : #endif // QGS_GEOMETRY_GAP_CHECK_H