21
21
22
22
void QgsGeometryGapCheck::collectErrors ( QList<QgsGeometryCheckError *> &errors, QStringList &messages, QAtomicInt *progressCounter, const QMap<QString, QgsFeatureIds> &ids ) const
23
23
{
24
- if ( progressCounter ) progressCounter->fetchAndAddRelaxed ( 1 );
24
+ if ( progressCounter )
25
+ progressCounter->fetchAndAddRelaxed ( 1 );
25
26
26
27
QVector<QgsAbstractGeometry *> geomList;
27
28
@@ -41,7 +42,7 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
41
42
42
43
// Create union of geometry
43
44
QString errMsg;
44
- QgsAbstractGeometry * unionGeom = geomEngine->combine ( geomList, &errMsg );
45
+ std::unique_ptr< QgsAbstractGeometry> unionGeom ( geomEngine->combine ( geomList, &errMsg ) );
45
46
qDeleteAll ( geomList );
46
47
if ( !unionGeom )
47
48
{
@@ -50,36 +51,32 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
50
51
}
51
52
52
53
// Get envelope of union
53
- geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( unionGeom, mContext ->tolerance );
54
- QgsAbstractGeometry * envelope = geomEngine->envelope ( &errMsg );
54
+ geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( unionGeom. get () , mContext ->tolerance );
55
+ std::unique_ptr< QgsAbstractGeometry> envelope ( geomEngine->envelope ( &errMsg ) );
55
56
if ( !envelope )
56
57
{
57
58
messages.append ( tr ( " Gap check: %1" ).arg ( errMsg ) );
58
- delete unionGeom;
59
59
return ;
60
60
}
61
61
62
62
// Buffer envelope
63
- geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( envelope, mContext ->tolerance );
63
+ geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( envelope. get () , mContext ->tolerance );
64
64
QgsAbstractGeometry *bufEnvelope = geomEngine->buffer ( 2 , 0 , GEOSBUF_CAP_SQUARE, GEOSBUF_JOIN_MITRE, 4 . ); // #spellok //#spellok
65
- delete envelope;
66
- envelope = bufEnvelope;
65
+ envelope.reset ( bufEnvelope );
67
66
68
67
// Compute difference between envelope and union to obtain gap polygons
69
- geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( envelope, mContext ->tolerance );
70
- QgsAbstractGeometry * diffGeom = geomEngine->difference ( unionGeom, &errMsg );
68
+ geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( envelope. get () , mContext ->tolerance );
69
+ std::unique_ptr< QgsAbstractGeometry> diffGeom ( geomEngine->difference ( unionGeom. get () , &errMsg ) );
71
70
if ( !diffGeom )
72
71
{
73
72
messages.append ( tr ( " Gap check: %1" ).arg ( errMsg ) );
74
- delete unionGeom;
75
- delete diffGeom;
76
73
return ;
77
74
}
78
75
79
76
// For each gap polygon which does not lie on the boundary, get neighboring polygons and add error
80
77
for ( int iPart = 0 , nParts = diffGeom->partCount (); iPart < nParts; ++iPart )
81
78
{
82
- QgsAbstractGeometry * gapGeom = QgsGeometryCheckerUtils::getGeomPart ( diffGeom, iPart )->clone ();
79
+ std::unique_ptr< QgsAbstractGeometry> gapGeom ( QgsGeometryCheckerUtils::getGeomPart ( diffGeom. get () , iPart )->clone () );
83
80
// Skip the gap between features and boundingbox
84
81
if ( gapGeom->boundingBox () == envelope->boundingBox () )
85
82
{
@@ -99,7 +96,7 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
99
96
QgsGeometryCheckerUtils::LayerFeatures layerFeatures ( mContext ->featurePools , featureIds.keys (), gapAreaBBox, mCompatibleGeometryTypes );
100
97
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeature : layerFeatures )
101
98
{
102
- if ( QgsGeometryCheckerUtils::sharedEdgeLength ( gapGeom, layerFeature.geometry (), mContext ->reducedTolerance ) > 0 )
99
+ if ( QgsGeometryCheckerUtils::sharedEdgeLength ( gapGeom. get () , layerFeature.geometry (), mContext ->reducedTolerance ) > 0 )
103
100
{
104
101
neighboringIds[layerFeature.layer ().id ()].insert ( layerFeature.feature ().id () );
105
102
gapAreaBBox.combineExtentWith ( layerFeature.geometry ()->boundingBox () );
@@ -108,17 +105,14 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
108
105
109
106
if ( neighboringIds.isEmpty () )
110
107
{
111
- delete gapGeom;
112
108
continue ;
113
109
}
114
110
115
111
// Add error
116
- errors.append ( new QgsGeometryGapCheckError ( this , " " , gapGeom, neighboringIds, gapGeom->area (), gapAreaBBox ) );
112
+ double area = gapGeom->area ();
113
+ errors.append ( new QgsGeometryGapCheckError ( this , QString (), gapGeom.release (), neighboringIds, area, gapAreaBBox ) );
117
114
118
115
}
119
- delete unionGeom;
120
- delete envelope;
121
- delete diffGeom;
122
116
}
123
117
124
118
void QgsGeometryGapCheck::fixError ( QgsGeometryCheckError *error, int method, const QMap<QString, int > & /* mergeAttributeIndices*/ , Changes &changes ) const
@@ -158,7 +152,7 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
158
152
for ( const QString &layerId : err->neighbors ().keys () )
159
153
{
160
154
QgsFeaturePool *featurePool = mContext ->featurePools [ layerId ];
161
- QgsAbstractGeometry * errLayerGeom = errGeometry->clone ();
155
+ std::unique_ptr< QgsAbstractGeometry> errLayerGeom ( errGeometry->clone () );
162
156
errLayerGeom->transform ( featurePool->getLayerToMapTransform (), QgsCoordinateTransform::ReverseTransform );
163
157
164
158
for ( QgsFeatureId testId : err->neighbors ()[layerId] )
@@ -172,7 +166,7 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
172
166
const QgsAbstractGeometry *testGeom = featureGeom.constGet ();
173
167
for ( int iPart = 0 , nParts = testGeom->partCount (); iPart < nParts; ++iPart )
174
168
{
175
- double len = QgsGeometryCheckerUtils::sharedEdgeLength ( errLayerGeom, QgsGeometryCheckerUtils::getGeomPart ( testGeom, iPart ), mContext ->reducedTolerance );
169
+ double len = QgsGeometryCheckerUtils::sharedEdgeLength ( errLayerGeom. get () , QgsGeometryCheckerUtils::getGeomPart ( testGeom, iPart ), mContext ->reducedTolerance );
176
170
if ( len > maxVal )
177
171
{
178
172
maxVal = len;
@@ -182,7 +176,6 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
182
176
}
183
177
}
184
178
}
185
- delete errLayerGeom;
186
179
}
187
180
188
181
if ( maxVal == 0 . )
@@ -192,21 +185,19 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
192
185
193
186
// Merge geometries
194
187
QgsFeaturePool *featurePool = mContext ->featurePools [ mergeLayerId ];
195
- QgsAbstractGeometry * errLayerGeom = errGeometry->clone ();
188
+ std::unique_ptr< QgsAbstractGeometry> errLayerGeom ( errGeometry->clone () );
196
189
errLayerGeom->transform ( featurePool->getLayerToMapTransform (), QgsCoordinateTransform::ReverseTransform );
197
190
QgsGeometry mergeFeatureGeom = mergeFeature.geometry ();
198
191
const QgsAbstractGeometry *mergeGeom = mergeFeatureGeom.constGet ();
199
- std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( errLayerGeom, mContext ->reducedTolerance );
200
- QgsAbstractGeometry *combinedGeom = geomEngine->combine ( QgsGeometryCheckerUtils::getGeomPart ( mergeGeom, mergePartIdx ), &errMsg );
201
- delete errLayerGeom;
192
+ std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine ( errLayerGeom.get (), mContext ->reducedTolerance );
193
+ std::unique_ptr<QgsAbstractGeometry> combinedGeom ( geomEngine->combine ( QgsGeometryCheckerUtils::getGeomPart ( mergeGeom, mergePartIdx ), &errMsg ) );
202
194
if ( !combinedGeom || combinedGeom->isEmpty () || !QgsWkbTypes::isSingleType ( combinedGeom->wkbType () ) )
203
195
{
204
- delete combinedGeom;
205
196
return false ;
206
197
}
207
198
208
199
// Add merged polygon to destination geometry
209
- replaceFeatureGeometryPart ( mergeLayerId, mergeFeature, mergePartIdx, combinedGeom, changes );
200
+ replaceFeatureGeometryPart ( mergeLayerId, mergeFeature, mergePartIdx, combinedGeom. release () , changes );
210
201
211
202
return true ;
212
203
}
0 commit comments