-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgsgeometrygapcheck.h
115 lines (97 loc) · 4.97 KB
/
qgsgeometrygapcheck.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/***************************************************************************
qgsgeometrygapcheck.h
---------------------
begin : September 2015
copyright : (C) 2014 by Sandro Mani / Sourcepole AG
email : smani at sourcepole dot ch
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#define SIP_NO_FILE
#ifndef QGS_GEOMETRY_GAP_CHECK_H
#define QGS_GEOMETRY_GAP_CHECK_H
#include "qgsgeometrycheck.h"
#include "qgsgeometrycheckerror.h"
class ANALYSIS_EXPORT QgsGeometryGapCheckError : public QgsGeometryCheckError
{
public:
QgsGeometryGapCheckError( const QgsGeometryCheck *check,
const QString &layerId,
const QgsGeometry &geometry,
const QMap<QString, QgsFeatureIds> &neighbors,
double area,
const QgsRectangle &gapAreaBBox )
: QgsGeometryCheckError( check, layerId, FEATUREID_NULL, geometry, geometry.constGet()->centroid(), QgsVertexId(), area, ValueArea )
, mNeighbors( neighbors )
, mGapAreaBBox( gapAreaBBox )
{
}
const QMap<QString, QgsFeatureIds> &neighbors() const { return mNeighbors; }
bool isEqual( QgsGeometryCheckError *other ) const override
{
QgsGeometryGapCheckError *err = dynamic_cast<QgsGeometryGapCheckError *>( other );
return err && QgsGeometryCheckerUtils::pointsFuzzyEqual( err->location(), location(), mCheck->context()->reducedTolerance ) && err->neighbors() == neighbors();
}
bool closeMatch( QgsGeometryCheckError *other ) const override
{
QgsGeometryGapCheckError *err = dynamic_cast<QgsGeometryGapCheckError *>( other );
return err && err->layerId() == layerId() && err->neighbors() == neighbors();
}
void update( const QgsGeometryCheckError *other ) override
{
QgsGeometryCheckError::update( other );
// Static cast since this should only get called if isEqual == true
const QgsGeometryGapCheckError *err = static_cast<const QgsGeometryGapCheckError *>( other );
mNeighbors = err->mNeighbors;
mGapAreaBBox = err->mGapAreaBBox;
}
bool handleChanges( const QgsGeometryCheck::Changes & /*changes*/ ) override
{
return true;
}
QgsRectangle affectedAreaBBox() const override
{
return mGapAreaBBox;
}
private:
QMap<QString, QgsFeatureIds> mNeighbors;
QgsRectangle mGapAreaBBox;
};
class ANALYSIS_EXPORT QgsGeometryGapCheck : public QgsGeometryCheck
{
public:
enum ResolutionMethod { MergeLongestEdge, NoChange };
/**
* The \a configuration accepts a "gapThreshold" key which specifies
* the maximum gap size in squared map units. Any gaps which are larger
* than this area are accepted. If "gapThreshold" is set to 0, the check
* is disabled.
*/
explicit QgsGeometryGapCheck( const QgsGeometryCheckContext *context, const QVariantMap &configuration );
QList<QgsWkbTypes::GeometryType> compatibleGeometryTypes() const override { return factoryCompatibleGeometryTypes(); }
void collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, QList<QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids = LayerFeatureIds() ) const override;
void fixError( const QMap<QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap<QString, int> &mergeAttributeIndices, Changes &changes ) const override;
QStringList resolutionMethods() const override;
QString description() const override;
QString id() const override;
QgsGeometryCheck::Flags flags() const override;
QgsGeometryCheck::CheckType checkType() const override { return factoryCheckType(); }
///@cond private
static QString factoryDescription() SIP_SKIP;
static QString factoryId() SIP_SKIP;
static QgsGeometryCheck::Flags factoryFlags() SIP_SKIP;
static QList<QgsWkbTypes::GeometryType> factoryCompatibleGeometryTypes() SIP_SKIP;
static bool factoryIsCompatible( QgsVectorLayer *layer ) SIP_SKIP;
static QgsGeometryCheck::CheckType factoryCheckType() SIP_SKIP;
///@endcond private
private:
bool mergeWithNeighbor( const QMap<QString, QgsFeaturePool *> &featurePools,
QgsGeometryGapCheckError *err, Changes &changes, QString &errMsg ) const;
const double mGapThresholdMapUnits;
};
#endif // QGS_GEOMETRY_GAP_CHECK_H