Skip to content

Commit 6c088e7

Browse files
committed
[Geometry checker] Fix logic to ensure that each pair of features is only compared once
1 parent d6d584b commit 6c088e7

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/plugins/geometry_checker/checks/qgsgeometryduplicatecheck.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,15 @@ void QgsGeometryDuplicateCheck::collectErrors( QList<QgsGeometryCheckError *> &e
6060
QList<QString> layerIds = featureIds.keys();
6161
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeatureA : layerFeaturesA )
6262
{
63+
// Ensure each pair of layers only gets compared once: remove the current layer from the layerIds, but add it to the layerList for layerFeaturesB
64+
layerIds.removeOne( layerFeatureA.layer().id() );
65+
6366
QgsRectangle bboxA = layerFeatureA.geometry()->boundingBox();
6467
QSharedPointer<QgsGeometryEngine> geomEngineA = QgsGeometryCheckerUtils::createGeomEngine( layerFeatureA.geometry(), mContext->tolerance );
6568
QMap<QString, QList<QgsFeatureId>> duplicates;
6669

6770
QgsWkbTypes::GeometryType geomType = layerFeatureA.feature().geometry().type();
68-
QgsGeometryCheckerUtils::LayerFeatures layerFeaturesB( mContext->featurePools, layerIds, bboxA, {geomType} );
71+
QgsGeometryCheckerUtils::LayerFeatures layerFeaturesB( mContext->featurePools, QList<QString>() << layerFeatureA.layer().id() << layerIds, bboxA, {geomType} );
6972
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeatureB : layerFeaturesB )
7073
{
7174
// > : only report overlaps within same layer once
@@ -101,8 +104,6 @@ void QgsGeometryDuplicateCheck::collectErrors( QList<QgsGeometryCheckError *> &e
101104
{
102105
errors.append( new QgsGeometryDuplicateCheckError( this, layerFeatureA, layerFeatureA.geometry()->centroid(), duplicates ) );
103106
}
104-
// Don't check already checked layers
105-
layerIds.removeOne( layerFeatureA.layer().id() );
106107
}
107108
}
108109

src/plugins/geometry_checker/checks/qgsgeometryoverlapcheck.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@ void QgsGeometryOverlapCheck::collectErrors( QList<QgsGeometryCheckError *> &err
3838
QList<QString> layerIds = featureIds.keys();
3939
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeatureA : layerFeaturesA )
4040
{
41+
// Ensure each pair of layers only gets compared once: remove the current layer from the layerIds, but add it to the layerList for layerFeaturesB
42+
layerIds.removeOne( layerFeatureA.layer().id() );
43+
4144
QgsRectangle bboxA = layerFeatureA.geometry()->boundingBox();
4245
QSharedPointer<QgsGeometryEngine> geomEngineA = QgsGeometryCheckerUtils::createGeomEngine( layerFeatureA.geometry(), mContext->tolerance );
4346

44-
QgsGeometryCheckerUtils::LayerFeatures layerFeaturesB( mContext->featurePools, layerIds, bboxA, mCompatibleGeometryTypes );
47+
QgsGeometryCheckerUtils::LayerFeatures layerFeaturesB( mContext->featurePools, QList<QString>() << layerFeatureA.layer().id() << layerIds, bboxA, mCompatibleGeometryTypes );
4548
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeatureB : layerFeaturesB )
4649
{
4750
// > : only report overlaps within same layer once
@@ -72,8 +75,6 @@ void QgsGeometryOverlapCheck::collectErrors( QList<QgsGeometryCheckError *> &err
7275
delete interGeom;
7376
}
7477
}
75-
// Don't check already checked layers
76-
layerIds.removeOne( layerFeatureA.layer().id() );
7778
}
7879
}
7980

0 commit comments

Comments
 (0)