@@ -26,37 +26,49 @@ void QgsGeometryDuplicateCheck::collectErrors( QList<QgsGeometryCheckError *> &e
26
26
QList<QString> layerIds = featureIds.keys ();
27
27
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeatureA : layerFeaturesA )
28
28
{
29
- // Don't check already checked layers
30
- layerIds.removeOne ( layerFeatureA.layer ().id () );
31
-
32
29
QgsRectangle bboxA = layerFeatureA.geometry ()->boundingBox ();
33
30
QSharedPointer<QgsGeometryEngine> geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureA.geometry (), mContext ->tolerance );
34
31
QMap<QString, QList<QgsFeatureId>> duplicates;
35
32
36
- QgsGeometryCheckerUtils::LayerFeatures layerFeaturesB ( mContext ->featurePools , QList<QString>() << layerFeatureA.layer ().id () << layerIds, bboxA, mCompatibleGeometryTypes );
33
+ QgsWkbTypes::GeometryType geomType = layerFeatureA.feature ().geometry ().type ();
34
+ QgsGeometryCheckerUtils::LayerFeatures layerFeaturesB ( mContext ->featurePools , layerIds, bboxA, {geomType} );
37
35
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeatureB : layerFeaturesB )
38
36
{
39
37
// > : only report overlaps within same layer once
40
38
if ( layerFeatureA.layer ().id () == layerFeatureB.layer ().id () && layerFeatureB.feature ().id () >= layerFeatureA.feature ().id () )
41
39
{
42
40
continue ;
43
41
}
44
- QString errMsg;
45
- QgsAbstractGeometry *diffGeom = geomEngineA->symDifference ( *layerFeatureB.geometry (), &errMsg );
46
- if ( diffGeom && diffGeom->area () < mContext ->tolerance )
42
+ if ( geomType == QgsWkbTypes::PointGeometry )
47
43
{
48
- duplicates[layerFeatureB.layer ().id ()].append ( layerFeatureB.feature ().id () );
44
+ const QgsPoint *p = dynamic_cast <const QgsPoint *>( layerFeatureA.geometry () );
45
+ const QgsPoint *q = dynamic_cast <const QgsPoint *>( layerFeatureB.geometry () );
46
+ if ( p && q && p->distanceSquared ( *q ) < mContext ->tolerance * mContext ->tolerance )
47
+ {
48
+ duplicates[layerFeatureB.layer ().id ()].append ( layerFeatureB.feature ().id () );
49
+ }
49
50
}
50
- else if ( !diffGeom )
51
+ else if ( geomType == QgsWkbTypes::PolygonGeometry )
51
52
{
52
- messages.append ( tr ( " Duplicate check between features %1 and %2: %3" ).arg ( layerFeatureA.id () ).arg ( layerFeatureB.id () ).arg ( errMsg ) );
53
+ QString errMsg;
54
+ QgsAbstractGeometry *diffGeom = geomEngineA->symDifference ( *layerFeatureB.geometry (), &errMsg );
55
+ if ( diffGeom && diffGeom->area () < mContext ->tolerance )
56
+ {
57
+ duplicates[layerFeatureB.layer ().id ()].append ( layerFeatureB.feature ().id () );
58
+ }
59
+ else if ( !diffGeom )
60
+ {
61
+ messages.append ( tr ( " Duplicate check between features %1 and %2: %3" ).arg ( layerFeatureA.id () ).arg ( layerFeatureB.id () ).arg ( errMsg ) );
62
+ }
63
+ delete diffGeom;
53
64
}
54
- delete diffGeom;
55
65
}
56
66
if ( !duplicates.isEmpty () )
57
67
{
58
68
errors.append ( new QgsGeometryDuplicateCheckError ( this , layerFeatureA, layerFeatureA.geometry ()->centroid (), duplicates ) );
59
69
}
70
+ // Don't check already checked layers
71
+ layerIds.removeOne ( layerFeatureA.layer ().id () );
60
72
}
61
73
}
62
74
@@ -76,6 +88,8 @@ void QgsGeometryDuplicateCheck::fixError( QgsGeometryCheckError *error, int meth
76
88
}
77
89
else if ( method == RemoveDuplicates )
78
90
{
91
+ QgsWkbTypes::GeometryType geomType = featureA.geometry ().type ();
92
+
79
93
QgsGeometryCheckerUtils::LayerFeature layerFeatureA ( featurePoolA, featureA, true );
80
94
QSharedPointer<QgsGeometryEngine> geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureA.geometry (), mContext ->tolerance );
81
95
@@ -91,14 +105,27 @@ void QgsGeometryDuplicateCheck::fixError( QgsGeometryCheckError *error, int meth
91
105
continue ;
92
106
}
93
107
QgsGeometryCheckerUtils::LayerFeature layerFeatureB ( featurePoolB, featureB, true );
94
- QgsAbstractGeometry *diffGeom = geomEngineA->symDifference ( *layerFeatureB.geometry () );
95
- if ( diffGeom && diffGeom->area () < mContext ->tolerance )
108
+ if ( geomType == QgsWkbTypes::PointGeometry )
96
109
{
97
- featurePoolB->deleteFeature ( featureB );
98
- changes[layerIdB][idB].append ( Change ( ChangeFeature, ChangeRemoved ) );
110
+ const QgsPoint *p = dynamic_cast <const QgsPoint *>( layerFeatureA.geometry () );
111
+ const QgsPoint *q = dynamic_cast <const QgsPoint *>( layerFeatureB.geometry () );
112
+ if ( p && q && p->distanceSquared ( *q ) < mContext ->tolerance * mContext ->tolerance )
113
+ {
114
+ featurePoolB->deleteFeature ( featureB );
115
+ changes[layerIdB][idB].append ( Change ( ChangeFeature, ChangeRemoved ) );
116
+ }
99
117
}
118
+ else if ( geomType == QgsWkbTypes::PolygonGeometry )
119
+ {
120
+ QgsAbstractGeometry *diffGeom = geomEngineA->symDifference ( *layerFeatureB.geometry () );
121
+ if ( diffGeom && diffGeom->area () < mContext ->tolerance )
122
+ {
123
+ featurePoolB->deleteFeature ( featureB );
124
+ changes[layerIdB][idB].append ( Change ( ChangeFeature, ChangeRemoved ) );
125
+ }
100
126
101
- delete diffGeom;
127
+ delete diffGeom;
128
+ }
102
129
}
103
130
}
104
131
error->setFixed ( method );
0 commit comments