QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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,
44  const QVariant &value,
46  : mCheck( check )
47  , mLayerId( layerFeature.layerId() )
48  , mFeatureId( layerFeature.feature().id() )
49  , mErrorLocation( errorLocation )
50  , mVidx( vidx )
51  , mValue( value )
52  , mValueType( valueType )
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  {
69  QgsCoordinateTransform ct( vl->crs(), check->context()->mapCrs, check->context()->transformContext );
70  try
71  {
72  mGeometry.transform( ct );
73  mErrorLocation = ct.transform( mErrorLocation );
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 QStringList methods = mCheck->resolutionMethods();
102  mResolutionMessage = methods[method];
103 }
104 
105 void QgsGeometryCheckError::setFixFailed( const QString &reason )
106 {
108  mResolutionMessage = reason;
109 }
110 
112 {
113  return other->check() == check() &&
114  other->layerId() == layerId() &&
115  other->featureId() == featureId() &&
116  other->vidx() == vidx();
117 }
118 
120 {
121  return false;
122 }
123 
125 {
126  if ( status() == StatusObsolete )
127  {
128  return false;
129  }
130 
131  for ( const QgsGeometryCheck::Change &change : changes.value( layerId() ).value( featureId() ) )
132  {
133  if ( change.what == QgsGeometryCheck::ChangeFeature )
134  {
135  if ( change.type == QgsGeometryCheck::ChangeRemoved )
136  {
137  return false;
138  }
139  else if ( change.type == QgsGeometryCheck::ChangeChanged )
140  {
141  // If the check is checking the feature at geometry nodes level, the
142  // error almost certainly invalid after a geometry change. In the other
143  // cases, it might likely still be valid.
145  }
146  }
147  else if ( change.what == QgsGeometryCheck::ChangePart )
148  {
149  if ( mVidx.part == change.vidx.part )
150  {
151  return false;
152  }
153  else if ( mVidx.part > change.vidx.part )
154  {
155  mVidx.part += change.type == QgsGeometryCheck::ChangeAdded ? 1 : -1;
156  }
157  }
158  else if ( change.what == QgsGeometryCheck::ChangeRing )
159  {
160  if ( mVidx.partEqual( change.vidx ) )
161  {
162  if ( mVidx.ring == change.vidx.ring )
163  {
164  return false;
165  }
166  else if ( mVidx.ring > change.vidx.ring )
167  {
168  mVidx.ring += change.type == QgsGeometryCheck::ChangeAdded ? 1 : -1;
169  }
170  }
171  }
172  else if ( change.what == QgsGeometryCheck::ChangeNode )
173  {
174  if ( mVidx.ringEqual( change.vidx ) )
175  {
176  if ( mVidx.vertex == change.vidx.vertex )
177  {
178  return false;
179  }
180  else if ( mVidx.vertex > change.vidx.vertex )
181  {
182  mVidx.vertex += change.type == QgsGeometryCheck::ChangeAdded ? 1 : -1;
183  }
184  }
185  }
186  }
187  return true;
188 }
189 
190 QMap<QString, QgsFeatureIds> QgsGeometryCheckError::involvedFeatures() const
191 {
192  return QMap<QString, QSet<QgsFeatureId> >();
193 }
194 
196 {
198  return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCheckGeometry.svg" ) );
199  else
200  return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmLineIntersections.svg" ) );
201 }
202 
204 {
205  Q_ASSERT( mCheck == other->mCheck );
206  Q_ASSERT( mLayerId == other->mLayerId );
207  Q_ASSERT( mFeatureId == other->mFeatureId );
209  mVidx = other->mVidx;
210  mValue = other->mValue;
211  mGeometry = other->mGeometry;
212 }
213 
214 QgsGeometryCheck::LayerFeatureIds::LayerFeatureIds( const QMap<QString, QgsFeatureIds> &ids )
215  : ids( ids )
216 {
217 }
The error is obsolete because of other modifications.
This change happens on part level.
A rectangle specified with double values.
Definition: qgsrectangle.h:41
The error is detected and pending to be handled.
virtual void update(const QgsGeometryCheckError *other)
Update this error with the information from other.
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
static QgsAbstractGeometry * getGeomPart(QgsAbstractGeometry *geom, int partIdx)
Something has been added.
virtual QgsRectangle contextBoundingBox() const
The context of the error.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
A class to represent a 2D point.
Definition: qgspointxy.h:43
virtual bool closeMatch(QgsGeometryCheckError *) const
Check if this error is almost equal to other.
qint64 QgsFeatureId
Definition: qgsfeatureid.h:25
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:122
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
ValueType
Describes the type of an error value.
void setFixFailed(const QString &reason)
Set the error status to failed and specify the reason for failure.
Something has been removed.
const QgsGeometryCheck * check() const
The geometry check that created this error.
This change happens on ring level.
QPointer< QgsVectorLayer > layer() const
The layer.
Utility class for identifying a unique vertex within a geometry.
virtual CheckType checkType() const =0
Returns the check type.
A layer feature combination to uniquely identify and access a feature in a set of layers...
const QgsGeometryCheck * mCheck
This class implements a geometry check.
const QString & layerId() const
The id of the layer on which this error has been detected.
const QgsCoordinateReferenceSystem mapCrs
The coordinate system in which calculations should be done.
virtual QIcon icon() const
Returns an icon that should be shown for this kind of error.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsGeometry geometry() const
The geometry of the error in map units.
Status status() const
The status of the error.
virtual QMap< QString, QgsFeatureIds > involvedFeatures() const
Returns a list of involved features.
bool partEqual(QgsVertexId o) const
bool ringEqual(QgsVertexId o) const
bool useMapCrs() const
Returns if the geometry is reprojected to the map CRS or not.
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
virtual QgsRectangle affectedAreaBBox() const
The bounding box of the affected area of the error.
Descripts a change to fix a geometry.
QgsGeometry geometry() const
Returns the geometry of this feature.
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.
virtual bool handleChanges(const QgsGeometryCheck::Changes &changes)
Apply a list of changes.
A fix has been tried on the error but failed.
Class for doing transforms between two map coordinate systems.
virtual QStringList resolutionMethods() const =0
Returns a list of descriptions for available resolutions for errors.
QgsFeatureId featureId() const
The id of the feature on which this error has been detected.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
const QgsGeometryCheckContext * context() const
Returns the context.
This represents an error reported by a geometry check.
This change happens on node level.
QVariant value() const
An additional value for the error.
ValueType valueType() const
The type of the value.
Represents a vector layer which manages a vector based data sets.
Something has been updated.
const QgsVertexId & vidx() const
The id of the affected vertex.
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...
This change happens on feature level.
virtual bool isEqual(QgsGeometryCheckError *other) const
Check if this error is equal to other.
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:86
The check controls individual nodes.
const QgsCoordinateTransformContext transformContext
The coordinate transform context with which transformations will be done.