@@ -41,8 +41,10 @@ void QgsGeometryOverlapCheck::collectErrors( const QMap<QString, QgsFeaturePool
41
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
42
layerIds.removeOne ( layerFeatureA.layer ()->id () );
43
43
44
- QgsRectangle bboxA = layerFeatureA.geometry ().constGet ()->boundingBox ();
45
- std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureA.geometry ().constGet (), mContext ->tolerance );
44
+ const QgsGeometry geomA = layerFeatureA.geometry ();
45
+ QgsRectangle bboxA = geomA.boundingBox ();
46
+ std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( geomA.constGet (), mContext ->tolerance );
47
+ geomEngineA->prepareGeometry ();
46
48
if ( !geomEngineA->isValid () )
47
49
{
48
50
messages.append ( tr ( " Overlap check failed for (%1): the geometry is invalid" ).arg ( layerFeatureA.id () ) );
@@ -56,14 +58,16 @@ void QgsGeometryOverlapCheck::collectErrors( const QMap<QString, QgsFeaturePool
56
58
break ;
57
59
58
60
// > : only report overlaps within same layer once
59
- if ( layerFeatureA.layer ()-> id () == layerFeatureB.layer ()-> id () && layerFeatureB.feature ().id () >= layerFeatureA.feature ().id () )
61
+ if ( layerFeatureA.layerId () == layerFeatureB.layerId () && layerFeatureB.feature ().id () >= layerFeatureA.feature ().id () )
60
62
{
61
63
continue ;
62
64
}
63
65
QString errMsg;
64
- if ( geomEngineA->overlaps ( layerFeatureB.geometry ().constGet (), &errMsg ) )
66
+ const QgsGeometry geometryB = layerFeatureB.geometry ();
67
+ const QgsAbstractGeometry *geomB = geometryB.constGet ();
68
+ if ( geomEngineA->overlaps ( geomB, &errMsg ) )
65
69
{
66
- std::unique_ptr<QgsAbstractGeometry> interGeom ( geomEngineA->intersection ( layerFeatureB. geometry (). constGet () ) );
70
+ std::unique_ptr<QgsAbstractGeometry> interGeom ( geomEngineA->intersection ( geomB ) );
67
71
if ( interGeom && !interGeom->isEmpty () )
68
72
{
69
73
QgsGeometryCheckerUtils::filter1DTypes ( interGeom.get () );
@@ -105,14 +109,16 @@ void QgsGeometryOverlapCheck::fixError( const QMap<QString, QgsFeaturePool *> &f
105
109
// Check if error still applies
106
110
QgsGeometryCheckerUtils::LayerFeature layerFeatureA ( featurePoolA, featureA, mContext , true );
107
111
QgsGeometryCheckerUtils::LayerFeature layerFeatureB ( featurePoolB, featureB, mContext , true );
108
- std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureA.geometry ().constGet (), mContext ->reducedTolerance );
112
+ const QgsGeometry geometryA = layerFeatureA.geometry ();
113
+ std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( geometryA.constGet (), mContext ->reducedTolerance );
109
114
110
- if ( !geomEngineA->overlaps ( layerFeatureB.geometry ().constGet () ) )
115
+ const QgsGeometry geometryB = layerFeatureB.geometry ();
116
+ if ( !geomEngineA->overlaps ( geometryB.constGet () ) )
111
117
{
112
118
error->setObsolete ();
113
119
return ;
114
120
}
115
- std::unique_ptr< QgsAbstractGeometry > interGeom ( geomEngineA->intersection ( layerFeatureB. geometry () .constGet (), &errMsg ) );
121
+ std::unique_ptr< QgsAbstractGeometry > interGeom ( geomEngineA->intersection ( geometryB .constGet (), &errMsg ) );
116
122
if ( !interGeom )
117
123
{
118
124
error->setFixFailed ( tr ( " Failed to compute intersection between overlapping features: %1" ).arg ( errMsg ) );
@@ -153,7 +159,7 @@ void QgsGeometryOverlapCheck::fixError( const QMap<QString, QgsFeaturePool *> &f
153
159
{
154
160
QgsGeometryCheckerUtils::filter1DTypes ( diff1.get () );
155
161
}
156
- std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureB. geometry () .constGet (), mContext ->reducedTolerance );
162
+ std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine ( geometryB .constGet (), mContext ->reducedTolerance );
157
163
std::unique_ptr< QgsAbstractGeometry > diff2 ( geomEngineB->difference ( interPart, &errMsg ) );
158
164
if ( !diff2 || diff2->isEmpty () )
159
165
{
0 commit comments