31 double layerToMapUnits =
scaleFactor( layerFeature.layer() );
32 for (
int iPart = 0, nParts = geom->
partCount(); iPart < nParts; ++iPart )
36 if ( checkThreshold( layerToMapUnits, part, value ) )
80 else if ( method ==
Delete )
88 if ( mergeWithNeighbor( featurePools, error->
layerId(), feature, vidx.
part, method, mergeAttributeIndices[error->
layerId()], changes, errMsg ) )
94 error->
setFixFailed( tr(
"Failed to merge with neighbor: %1" ).arg( errMsg ) );
103 bool QgsGeometryAreaCheck::checkThreshold(
double layerToMapUnits,
const QgsAbstractGeometry *geom,
double &value )
const 105 value = geom->
area();
106 double threshold = mAreaThreshold / ( layerToMapUnits * layerToMapUnits );
107 return value < threshold;
110 bool QgsGeometryAreaCheck::mergeWithNeighbor(
const QMap<QString, QgsFeaturePool *> &featurePools,
112 int partIdx,
int method,
int mergeAttributeIndex,
Changes &changes, QString &errMsg )
const 118 int mergePartIdx = -1;
119 bool matchFound =
false;
128 if ( !featurePool->
getFeature( testId, testFeature ) )
134 for (
int testPartIdx = 0, nTestParts = testGeom->
partCount(); testPartIdx < nTestParts; ++testPartIdx )
136 if ( testId == feature.
id() && testPartIdx == partIdx )
152 if ( dynamic_cast<const QgsGeometryCollection *>( testGeom ) )
155 val = testGeom->
area();
160 mergeFeature = testFeature;
161 mergePartIdx = testPartIdx;
166 if ( testFeature.
attribute( mergeAttributeIndex ) == feature.
attribute( mergeAttributeIndex ) )
168 mergeFeature = testFeature;
169 mergePartIdx = testPartIdx;
182 if ( !matchFound && maxVal == 0. )
198 if ( mergeFeature.
id() == feature.
id() && mergePartIdx > partIdx )
211 static QStringList methods = QStringList()
212 << tr(
"Merge with neighboring polygon with longest shared edge" )
213 << tr(
"Merge with neighboring polygon with largest area" )
214 << tr(
"Merge with neighboring polygon with identical attribute value, if any, or leave as is" )
215 << tr(
"Delete feature" )
216 << tr(
"No action" );
QList< QgsWkbTypes::GeometryType > compatibleGeometryTypes() const override
A list of geometry types for which this check can be performed.
QgsFeatureIds getIntersects(const QgsRectangle &rect) const
Gets all feature ids in the bounding box rect.
virtual bool isEmpty() const
Returns true if the geometry is empty.
QSet< QgsFeatureId > QgsFeatureIds
bool getFeature(QgsFeatureId id, QgsFeature &feature, QgsFeedback *feedback=nullptr)
Retrieves the feature with the specified id into feature.
double scaleFactor(const QPointer< QgsVectorLayer > &layer) const
Determines the scale factor of a layer to the map coordinate reference system.
static QgsAbstractGeometry * getGeomPart(QgsAbstractGeometry *geom, int partIdx)
bool isValid() const
Returns true if the vertex id is valid.
QMap< QString, QgsFeatureIds > toMap() const
Contains a set of layers and feature ids in those layers to pass to a geometry check.
A geometry is the spatial representation of a feature.
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...
void replaceFeatureGeometryPart(const QMap< QString, QgsFeaturePool *> &featurePools, const QString &layerId, QgsFeature &feature, int partIdx, QgsAbstractGeometry *newPartGeom, Changes &changes) const
Replaces a part in a feature geometry.
void setFixFailed(const QString &reason)
Set the error status to failed and specify the reason for failure.
virtual QgsPoint centroid() const
Returns the centroid of the geometry.
Base class for feedback objects to be used for cancelation of something running in a worker thread...
QgsVectorLayer * layer() const
Gets a pointer to the underlying layer.
static double sharedEdgeLength(const QgsAbstractGeometry *geom1, const QgsAbstractGeometry *geom2, double tol)
Utility class for identifying a unique vertex within a geometry.
A layer feature combination to uniquely identify and access a feature in a set of layers...
double area() const override
Returns the area of the geometry.
void collectErrors(const QMap< QString, QgsFeaturePool *> &featurePools, QList< QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids=LayerFeatureIds()) const override
The main worker method.
virtual double area() const
Returns the area of the geometry.
Abstract base class for all geometries.
QMap< QString, QgsFeatureIds > allLayerFeatureIds(const QMap< QString, QgsFeaturePool *> &featurePools) const
Returns all layers and feature ids.
const QString & layerId() const
The id of the layer on which this error has been detected.
const QgsGeometryCheckContext * mContext
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
const double reducedTolerance
The tolerance to allow for in geometry checks.
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.
static bool isSingleType(Type type)
Returns true if the WKB type is a single type.
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
A feature pool is based on a vector layer and caches features.
void setFixed(int method)
Set the status to fixed and specify the method that has been used to fix the error.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
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)
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.
QStringList resolutionMethods() const override
Returns a list of descriptions for available resolutions for errors.
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
const QgsVertexId & vidx() const
The id of the affected vertex.
void deleteFeatureGeometryPart(const QMap< QString, QgsFeaturePool *> &featurePools, const QString &layerId, QgsFeature &feature, int partIdx, Changes &changes) const
Deletes a part of a feature geometry.
virtual int partCount() const =0
Returns count of parts contained in the geometry.