24 QString QgsGeometryDuplicateCheckError::duplicatesString(
const QMap<QString, QgsFeaturePool *> &featurePools,
const QMap<QString, QList<QgsFeatureId>> &duplicates )
29 str.append( featurePools[it.key()]->layer()->name() +
":" );
31 ids.reserve( it.value().length() );
34 ids.append( QString::number(
id ) );
36 str.back() += ids.join(
',' );
38 return str.join( QStringLiteral(
"; " ) );
44 QMap<QString, QgsFeatureIds> featureIds = ids.
isEmpty() ? allLayerFeatureIds( featurePools ) : ids.
toMap();
46 QList<QString> layerIds = featureIds.keys();
50 layerIds.removeOne( layerFeatureA.layer()->id() );
52 QgsRectangle bboxA = layerFeatureA.geometry().boundingBox();
54 if ( !geomEngineA->isValid() )
56 messages.append( tr(
"Duplicate check failed for (%1): the geometry is invalid" ).arg( layerFeatureA.id() ) );
66 if ( layerFeatureA.layer()->id() == layerFeatureB.layer()->id() && layerFeatureB.feature().id() >= layerFeatureA.feature().id() )
71 QgsAbstractGeometry *diffGeom = geomEngineA->symDifference( layerFeatureB.geometry().constGet(), &errMsg );
72 if ( errMsg.isEmpty() && diffGeom && diffGeom->
isEmpty() )
74 duplicates[layerFeatureB.layer()->id()].append( layerFeatureB.feature().id() );
76 else if ( !errMsg.isEmpty() )
78 messages.append( tr(
"Duplicate check failed for (%1, %2): %3" ).arg( layerFeatureA.id(), layerFeatureB.id(), errMsg ) );
82 if ( !duplicates.isEmpty() )
99 if ( method == NoChange )
103 else if ( method == RemoveDuplicates )
109 for (
const QString &layerIdB : duplicateError->duplicates().keys() )
112 for (
QgsFeatureId idB : duplicateError->duplicates()[layerIdB] )
115 if ( !featurePoolB->
getFeature( idB, featureB ) )
121 if ( diffGeom && diffGeom->
isEmpty() )
124 changes[layerIdB][idB].append(
Change( ChangeFeature, ChangeRemoved ) );
140 static QStringList methods = QStringList()
142 << tr(
"Remove duplicates" );
148 return QStringLiteral(
"QgsGeometryDuplicateCheck" );
void collectErrors(const QMap< QString, QgsFeaturePool *> &featurePools, QList< QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids=LayerFeatureIds()) const override
The main worker method.
A rectangle specified with double values.
virtual bool isEmpty() const
Returns true if the geometry is empty.
static QString factoryId()
bool getFeature(QgsFeatureId id, QgsFeature &feature, QgsFeedback *feedback=nullptr)
Retrieves the feature with the specified id into feature.
QMap< QString, QgsFeatureIds > toMap() const
Contains a set of layers and feature ids in those layers to pass to a geometry check.
CheckType
The type of a check.
void setObsolete()
Set the error status to obsolete.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
static QgsGeometryCheck::CheckType factoryCheckType()
void setFixFailed(const QString &reason)
Set the error status to failed and specify the reason for failure.
Base class for feedback objects to be used for cancelation of something running in a worker thread...
The check controls geometries as a whole.
A layer feature combination to uniquely identify and access a feature in a set of layers...
void fixError(const QMap< QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap< QString, int > &mergeAttributeIndices, Changes &changes) const override
Fix the error error with the specified method.
Abstract base class for all geometries.
const QString & layerId() const
The id of the layer on which this error has been detected.
A list of layers and feature ids for each of these layers.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
QMap< QString, QList< QgsFeatureId > > duplicates() const
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
A feature pool is based on a vector layer and caches features.
Descripts a change to fix a geometry.
void setFixed(int method)
Set the status to fixed and specify the method that has been used to fix the error.
virtual void deleteFeature(QgsFeatureId fid)=0
Removes a feature from this pool.
QgsGeometryDuplicateCheckError(const QgsGeometryCheck *check, const QgsGeometryCheckerUtils::LayerFeature &layerFeature, const QgsPointXY &errorLocation, const QMap< QString, QgsFeaturePool *> &featurePools, const QMap< QString, QList< QgsFeatureId >> &duplicates)
QgsFeatureId featureId() const
The id of the feature on which this error has been detected.
This represents an error reported by a geometry check.
static std::unique_ptr< QgsGeometryEngine > createGeomEngine(const QgsAbstractGeometry *geometry, double tolerance)
QStringList resolutionMethods() const override
Returns a list of descriptions for available resolutions for errors.
const QgsGeometry & geometry() const
Returns the geometry of this feature.