QGIS API Documentation  3.23.0-Master (eb871beae0)
qgsgeometrycheckerror.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsgeometrycheckerror.cpp
3  --------
4  begin : September 2018
5  copyright : (C) 2018 by Denis Rouzaud
6  email : [email protected]
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsgeometrycheckerror.h"
19 #include "qgsapplication.h"
20 
22  const QString &layerId,
23  QgsFeatureId featureId,
24  const QgsGeometry &geometry,
25  const QgsPointXY &errorLocation,
26  QgsVertexId vidx,
27  const QVariant &value, ValueType valueType )
28  : mCheck( check )
29  , mLayerId( layerId )
30  , mFeatureId( featureId )
31  , mGeometry( geometry )
32  , mErrorLocation( errorLocation )
33  , mVidx( vidx )
34  , mValue( value )
35  , mValueType( valueType )
36  , mStatus( StatusPending )
37 {
38 }
39 
41  const QgsGeometryCheckerUtils::LayerFeature &layerFeature,
42  const QgsPointXY &errorLocation,
43  QgsVertexId vidx,
44  const QVariant &value,
45  ValueType valueType )
46  : mCheck( check )
47  , mLayerId( layerFeature.layerId() )
48  , mFeatureId( layerFeature.feature().id() )
49  , mErrorLocation( errorLocation )
50  , mVidx( vidx )
51  , mValue( value )
52  , mValueType( valueType )
53  , mStatus( StatusPending )
54 {
55  if ( vidx.part != -1 )
56  {
57  const QgsGeometry geom = layerFeature.geometry();
59  }
60  else
61  {
62  mGeometry = layerFeature.geometry();
63  }
64  if ( !layerFeature.useMapCrs() )
65  {
66  QgsVectorLayer *vl = layerFeature.layer().data();
67  if ( vl )
68  {
70  try
71  {
72  mGeometry.transform( ct );
74  }
75  catch ( const QgsCsException & )
76  {
77  QgsDebugMsg( QStringLiteral( "Can not show error in current map coordinate reference system" ) );
78  }
79  }
80  }
81 }
82 
84 {
85  return mGeometry;
86 }
87 
89 {
90  return QgsRectangle();
91 }
92 
94 {
95  return mGeometry.boundingBox();
96 }
97 
99 {
101  const QList<QgsGeometryCheckResolutionMethod> methods = mCheck->availableResolutionMethods();
102  for ( const QgsGeometryCheckResolutionMethod &fix : methods )
103  {
104  if ( fix.id() == method )
105  mResolutionMessage = fix.name();
106  }
107 }
108 
109 void QgsGeometryCheckError::setFixFailed( const QString &reason )
110 {
112  mResolutionMessage = reason;
113 }
114 
116 {
117  return other->check() == check() &&
118  other->layerId() == layerId() &&
119  other->featureId() == featureId() &&
120  other->vidx() == vidx();
121 }
122 
124 {
125  return false;
126 }
127 
129 {
130  if ( status() == StatusObsolete )
131  {
132  return false;
133  }
134 
135  for ( const QgsGeometryCheck::Change &change : changes.value( layerId() ).value( featureId() ) )
136  {
137  if ( change.what == QgsGeometryCheck::ChangeFeature )
138  {
139  if ( change.type == QgsGeometryCheck::ChangeRemoved )
140  {
141  return false;
142  }
143  else if ( change.type == QgsGeometryCheck::ChangeChanged )
144  {
145  // If the check is checking the feature at geometry nodes level, the
146  // error almost certainly invalid after a geometry change. In the other
147  // cases, it might likely still be valid.
149  }
150  }
151  else if ( change.what == QgsGeometryCheck::ChangePart )
152  {
153  if ( mVidx.part == change.vidx.part )
154  {
155  return false;
156  }
157  else if ( mVidx.part > change.vidx.part )
158  {
159  mVidx.part += change.type == QgsGeometryCheck::ChangeAdded ? 1 : -1;
160  }
161  }
162  else if ( change.what == QgsGeometryCheck::ChangeRing )
163  {
164  if ( mVidx.partEqual( change.vidx ) )
165  {
166  if ( mVidx.ring == change.vidx.ring )
167  {
168  return false;
169  }
170  else if ( mVidx.ring > change.vidx.ring )
171  {
172  mVidx.ring += change.type == QgsGeometryCheck::ChangeAdded ? 1 : -1;
173  }
174  }
175  }
176  else if ( change.what == QgsGeometryCheck::ChangeNode )
177  {
178  if ( mVidx.ringEqual( change.vidx ) )
179  {
180  if ( mVidx.vertex == change.vidx.vertex )
181  {
182  return false;
183  }
184  else if ( mVidx.vertex > change.vidx.vertex )
185  {
186  mVidx.vertex += change.type == QgsGeometryCheck::ChangeAdded ? 1 : -1;
187  }
188  }
189  }
190  }
191  return true;
192 }
193 
194 QMap<QString, QgsFeatureIds> QgsGeometryCheckError::involvedFeatures() const
195 {
196  return QMap<QString, QSet<QgsFeatureId> >();
197 }
198 
200 {
202  return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCheckGeometry.svg" ) );
203  else
204  return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmLineIntersections.svg" ) );
205 }
206 
208 {
209  Q_ASSERT( mCheck == other->mCheck );
210  Q_ASSERT( mLayerId == other->mLayerId );
211  Q_ASSERT( mFeatureId == other->mFeatureId );
213  mVidx = other->mVidx;
214  mValue = other->mValue;
215  mGeometry = other->mGeometry;
216 }
217 
218 QgsGeometryCheck::LayerFeatureIds::LayerFeatureIds( const QMap<QString, QgsFeatureIds> &idsIn )
219  : ids( idsIn )
220 {
221 }
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Class for doing transforms between two map coordinate systems.
QgsPointXY transform(const QgsPointXY &point, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward) const SIP_THROW(QgsCsException)
Transform the point from the source CRS to the destination CRS.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:66
const QgsCoordinateTransformContext transformContext
The coordinate transform context with which transformations will be done.
const QgsCoordinateReferenceSystem mapCrs
The coordinate system in which calculations should be done.
This represents an error reported by a geometry check.
ValueType
Describes the type of an error value.
const QString & layerId() const
The id of the layer on which this error has been detected.
virtual QMap< QString, QgsFeatureIds > involvedFeatures() const
Returns a list of involved features.
@ StatusFixed
The error is fixed.
@ StatusFixFailed
A fix has been tried on the error but failed.
@ StatusObsolete
The error is obsolete because of other modifications.
Status status() const
The status of the error.
const QgsVertexId & vidx() const
The id of the affected vertex.
QgsFeatureId featureId() const
The id of the feature on which this error has been detected.
virtual void update(const QgsGeometryCheckError *other)
Update this error with the information from other.
const QgsGeometryCheck * mCheck
QgsGeometryCheckError(const QgsGeometryCheck *check, const QgsGeometryCheckerUtils::LayerFeature &layerFeature, const QgsPointXY &errorLocation, QgsVertexId vidx=QgsVertexId(), const QVariant &value=QVariant(), ValueType valueType=ValueOther)
Create a new geometry check error with the parent check and for the layerFeature pair at the errorLoc...
void setFixed(int method)
Set the status to fixed and specify the method that has been used to fix the error.
void setFixFailed(const QString &reason)
Set the error status to failed and specify the reason for failure.
const QgsGeometryCheck * check() const
The geometry check that created this error.
QgsGeometry geometry() const
The geometry of the error in map units.
QVariant value() const
An additional value for the error.
virtual bool isEqual(QgsGeometryCheckError *other) const
Check if this error is equal to other.
virtual bool closeMatch(QgsGeometryCheckError *) const
Check if this error is almost equal to other.
virtual QgsRectangle affectedAreaBBox() const
The bounding box of the affected area of the error.
virtual QIcon icon() const
Returns an icon that should be shown for this kind of error.
virtual bool handleChanges(const QgsGeometryCheck::Changes &changes)
Apply a list of changes.
virtual QgsRectangle contextBoundingBox() const
The context of the error.
This class implements a resolution for problems detected in geometry checks.
This class implements a geometry check.
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
virtual QList< QgsGeometryCheckResolutionMethod > availableResolutionMethods() const
Returns a list of available resolution methods.
@ ChangeNode
This change happens on node level.
@ ChangeRing
This change happens on ring level.
@ ChangeFeature
This change happens on feature level.
@ ChangePart
This change happens on part level.
@ FeatureNodeCheck
The check controls individual nodes.
@ ChangeChanged
Something has been updated.
@ ChangeAdded
Something has been added.
@ ChangeRemoved
Something has been removed.
virtual CheckType checkType() const =0
Returns the check type.
const QgsGeometryCheckContext * context() const
Returns the context.
A layer feature combination to uniquely identify and access a feature in a set of layers.
QgsGeometry geometry() const
Returns the geometry of this feature.
QPointer< QgsVectorLayer > layer() const
The layer.
bool useMapCrs() const
Returns if the geometry is reprojected to the map CRS or not.
static QgsAbstractGeometry * getGeomPart(QgsAbstractGeometry *geom, int partIdx)
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:125
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:79
A class to represent a 2D point.
Definition: qgspointxy.h:59
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Represents a vector layer which manages a vector based data sets.
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
Descripts a change to fix a geometry.
Utility class for identifying a unique vertex within a geometry.
Definition: qgsvertexid.h:31
int vertex
Vertex number.
Definition: qgsvertexid.h:95
int part
Part number.
Definition: qgsvertexid.h:89
bool ringEqual(QgsVertexId o) const SIP_HOLDGIL
Returns true if this vertex ID belongs to the same ring as another vertex ID (i.e.
Definition: qgsvertexid.h:69
int ring
Ring number.
Definition: qgsvertexid.h:92
bool partEqual(QgsVertexId o) const SIP_HOLDGIL
Returns true if this vertex ID belongs to the same part as another vertex ID.
Definition: qgsvertexid.h:60