@@ -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,15 +58,17 @@ 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
64
66
QString errMsg;
65
- if ( geomEngineA->overlaps ( layerFeatureB.geometry ().constGet (), &errMsg ) )
67
+ const QgsGeometry geometryB = layerFeatureB.geometry ();
68
+ const QgsAbstractGeometry *geomB = geometryB.constGet ();
69
+ if ( geomEngineA->overlaps ( geomB, &errMsg ) )
66
70
{
67
- std::unique_ptr<QgsAbstractGeometry> interGeom ( geomEngineA->intersection ( layerFeatureB. geometry (). constGet () ) );
71
+ std::unique_ptr<QgsAbstractGeometry> interGeom ( geomEngineA->intersection ( geomB ) );
68
72
if ( interGeom && !interGeom->isEmpty () )
69
73
{
70
74
QgsGeometryCheckerUtils::filter1DTypes ( interGeom.get () );
@@ -106,14 +110,17 @@ void QgsGeometryOverlapCheck::fixError( const QMap<QString, QgsFeaturePool *> &f
106
110
// Check if error still applies
107
111
QgsGeometryCheckerUtils::LayerFeature layerFeatureA ( featurePoolA, featureA, mContext , true );
108
112
QgsGeometryCheckerUtils::LayerFeature layerFeatureB ( featurePoolB, featureB, mContext , true );
109
- std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureA.geometry ().constGet (), mContext ->reducedTolerance );
113
+ const QgsGeometry geometryA = layerFeatureA.geometry ();
114
+ std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine ( geometryA.constGet (), mContext ->reducedTolerance );
115
+ geomEngineA->prepareGeometry ();
110
116
111
- if ( !geomEngineA->overlaps ( layerFeatureB.geometry ().constGet () ) )
117
+ const QgsGeometry geometryB = layerFeatureB.geometry ();
118
+ if ( !geomEngineA->overlaps ( geometryB.constGet () ) )
112
119
{
113
120
error->setObsolete ();
114
121
return ;
115
122
}
116
- std::unique_ptr< QgsAbstractGeometry > interGeom ( geomEngineA->intersection ( layerFeatureB. geometry () .constGet (), &errMsg ) );
123
+ std::unique_ptr< QgsAbstractGeometry > interGeom ( geomEngineA->intersection ( geometryB .constGet (), &errMsg ) );
117
124
if ( !interGeom )
118
125
{
119
126
error->setFixFailed ( tr ( " Failed to compute intersection between overlapping features: %1" ).arg ( errMsg ) );
@@ -154,7 +161,8 @@ void QgsGeometryOverlapCheck::fixError( const QMap<QString, QgsFeaturePool *> &f
154
161
{
155
162
QgsGeometryCheckerUtils::filter1DTypes ( diff1.get () );
156
163
}
157
- std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine ( layerFeatureB.geometry ().constGet (), mContext ->reducedTolerance );
164
+ std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine ( geometryB.constGet (), mContext ->reducedTolerance );
165
+ geomEngineB->prepareGeometry ();
158
166
std::unique_ptr< QgsAbstractGeometry > diff2 ( geomEngineB->difference ( interPart, &errMsg ) );
159
167
if ( !diff2 || diff2->isEmpty () )
160
168
{
0 commit comments