diff --git a/python/analysis/auto_generated/vector/geometry_checker/qgsgeometrycheckerutils.sip.in b/python/analysis/auto_generated/vector/geometry_checker/qgsgeometrycheckerutils.sip.in index a583227d07e..62019eddb24 100644 --- a/python/analysis/auto_generated/vector/geometry_checker/qgsgeometrycheckerutils.sip.in +++ b/python/analysis/auto_generated/vector/geometry_checker/qgsgeometrycheckerutils.sip.in @@ -51,7 +51,7 @@ If ``useMapCrs`` is ``True``, geometries will be reprojected to the mapCrs defin in ``context``. %End - const QgsFeature &feature() const; + QgsFeature feature() const; %Docstring Returns the feature. The geometry will not be reprojected regardless of useMapCrs. @@ -63,7 +63,7 @@ The geometry will not be reprojected regardless of useMapCrs. The layer id. %End - const QgsGeometry &geometry() const; + QgsGeometry geometry() const; %Docstring Returns the geometry of this feature. If useMapCrs was specified, it will already be reprojected into the diff --git a/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.cpp b/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.cpp index d437b2d9acb..17644e50c0e 100644 --- a/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.cpp +++ b/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.cpp @@ -52,7 +52,7 @@ QgsGeometryCheckerUtils::LayerFeature::LayerFeature( const QgsFeaturePool *pool, } } -const QgsFeature &QgsGeometryCheckerUtils::LayerFeature::feature() const +QgsFeature QgsGeometryCheckerUtils::LayerFeature::feature() const { return mFeature; } @@ -67,7 +67,7 @@ QString QgsGeometryCheckerUtils::LayerFeature::layerId() const return mFeaturePool->layerId(); } -const QgsGeometry &QgsGeometryCheckerUtils::LayerFeature::geometry() const +QgsGeometry QgsGeometryCheckerUtils::LayerFeature::geometry() const { return mGeometry; } diff --git a/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.h b/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.h index 474332cf48e..6c7416dce94 100644 --- a/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.h +++ b/src/analysis/vector/geometry_checker/qgsgeometrycheckerutils.h @@ -64,7 +64,7 @@ class ANALYSIS_EXPORT QgsGeometryCheckerUtils * Returns the feature. * The geometry will not be reprojected regardless of useMapCrs. */ - const QgsFeature &feature() const; + QgsFeature feature() const; /** * The layer. @@ -81,7 +81,7 @@ class ANALYSIS_EXPORT QgsGeometryCheckerUtils * If useMapCrs was specified, it will already be reprojected into the * CRS specified in the context specified in the constructor. */ - const QgsGeometry &geometry() const; + QgsGeometry geometry() const; /** * Returns a combination of the layerId and the feature id. diff --git a/src/analysis/vector/geometry_checker/qgsgeometrygapcheck.cpp b/src/analysis/vector/geometry_checker/qgsgeometrygapcheck.cpp index 440eeca586d..041143dd233 100644 --- a/src/analysis/vector/geometry_checker/qgsgeometrygapcheck.cpp +++ b/src/analysis/vector/geometry_checker/qgsgeometrygapcheck.cpp @@ -115,10 +115,11 @@ void QgsGeometryGapCheck::collectErrors( const QMap & const QgsGeometryCheckerUtils::LayerFeatures layerFeatures( featurePools, featureIds.keys(), gapAreaBBox, compatibleGeometryTypes(), mContext ); for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeature : layerFeatures ) { - if ( QgsGeometryCheckerUtils::sharedEdgeLength( gapGeom.get(), layerFeature.geometry().constGet(), mContext->reducedTolerance ) > 0 ) + const QgsGeometry geom = layerFeature.geometry(); + if ( QgsGeometryCheckerUtils::sharedEdgeLength( gapGeom.get(), geom.constGet(), mContext->reducedTolerance ) > 0 ) { neighboringIds[layerFeature.layer()->id()].insert( layerFeature.feature().id() ); - gapAreaBBox.combineExtentWith( layerFeature.geometry().constGet()->boundingBox() ); + gapAreaBBox.combineExtentWith( layerFeature.geometry().boundingBox() ); } } @@ -193,7 +194,7 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( const QMappartCount(); iPart < nParts; ++iPart ) { @@ -219,7 +220,7 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( const QMap errLayerGeom( errGeometry->clone() ); QgsCoordinateTransform ct( featurePool->crs(), mContext->mapCrs, mContext->transformContext ); errLayerGeom->transform( ct, QgsCoordinateTransform::ReverseTransform ); - QgsGeometry mergeFeatureGeom = mergeFeature.geometry(); + const QgsGeometry mergeFeatureGeom = mergeFeature.geometry(); const QgsAbstractGeometry *mergeGeom = mergeFeatureGeom.constGet(); std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine( errLayerGeom.get(), mContext->reducedTolerance ); std::unique_ptr combinedGeom( geomEngine->combine( QgsGeometryCheckerUtils::getGeomPart( mergeGeom, mergePartIdx ), &errMsg ) ); diff --git a/src/analysis/vector/geometry_checker/qgsgeometrylinelayerintersectioncheck.cpp b/src/analysis/vector/geometry_checker/qgsgeometrylinelayerintersectioncheck.cpp index fe964a99a68..f6608d6efa2 100644 --- a/src/analysis/vector/geometry_checker/qgsgeometrylinelayerintersectioncheck.cpp +++ b/src/analysis/vector/geometry_checker/qgsgeometrylinelayerintersectioncheck.cpp @@ -57,7 +57,7 @@ void QgsGeometryLineLayerIntersectionCheck::collectErrors( const QMap( part ) ) { - QList< const QgsLineString * > rings = QgsGeometryCheckerUtils::polygonRings( polygon ); + const QList< const QgsLineString * > rings = QgsGeometryCheckerUtils::polygonRings( polygon ); for ( const QgsLineString *ring : rings ) { const QList< QgsPoint > intersections = QgsGeometryCheckerUtils::lineIntersections( line, ring, mContext->tolerance ); diff --git a/src/analysis/vector/geometry_checker/qgsgeometrymissingvertexcheck.cpp b/src/analysis/vector/geometry_checker/qgsgeometrymissingvertexcheck.cpp index 215a8bff42d..cfda10a4c07 100644 --- a/src/analysis/vector/geometry_checker/qgsgeometrymissingvertexcheck.cpp +++ b/src/analysis/vector/geometry_checker/qgsgeometrymissingvertexcheck.cpp @@ -48,7 +48,8 @@ void QgsGeometryMissingVertexCheck::collectErrors( const QMap( geom ) ) { @@ -129,7 +130,7 @@ void QgsGeometryMissingVertexCheck::processPolygon( const QgsCurvePolygon *polyg const QgsFeature ¤tFeature = layerFeature.feature(); std::unique_ptr boundaries = qgis::make_unique(); - std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine( polygon->exteriorRing(), mContext->tolerance ); + std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine( polygon->exteriorRing()->clone(), mContext->tolerance ); boundaries->addGeometry( geomEngine->buffer( mContext->tolerance, 5 ) ); const int numRings = polygon->numInteriorRings(); @@ -155,7 +156,8 @@ void QgsGeometryMissingVertexCheck::processPolygon( const QgsCurvePolygon *polyg if ( feedback && feedback->isCanceled() ) break; - QgsVertexIterator vertexIterator = compareFeature.geometry().vertices(); + const QgsGeometry compareGeometry = compareFeature.geometry(); + QgsVertexIterator vertexIterator = compareGeometry.vertices(); while ( vertexIterator.hasNext() ) { const QgsPoint &pt = vertexIterator.next(); diff --git a/src/analysis/vector/geometry_checker/qgsgeometryoverlapcheck.cpp b/src/analysis/vector/geometry_checker/qgsgeometryoverlapcheck.cpp index e4975e20f2e..f79ae657ca3 100644 --- a/src/analysis/vector/geometry_checker/qgsgeometryoverlapcheck.cpp +++ b/src/analysis/vector/geometry_checker/qgsgeometryoverlapcheck.cpp @@ -41,8 +41,10 @@ void QgsGeometryOverlapCheck::collectErrors( const QMapid() ); - QgsRectangle bboxA = layerFeatureA.geometry().constGet()->boundingBox(); - std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine( layerFeatureA.geometry().constGet(), mContext->tolerance ); + const QgsGeometry geomA = layerFeatureA.geometry(); + QgsRectangle bboxA = geomA.boundingBox(); + std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine( geomA.constGet(), mContext->tolerance ); + geomEngineA->prepareGeometry(); if ( !geomEngineA->isValid() ) { messages.append( tr( "Overlap check failed for (%1): the geometry is invalid" ).arg( layerFeatureA.id() ) ); @@ -56,14 +58,16 @@ void QgsGeometryOverlapCheck::collectErrors( const QMap : only report overlaps within same layer once - if ( layerFeatureA.layer()->id() == layerFeatureB.layer()->id() && layerFeatureB.feature().id() >= layerFeatureA.feature().id() ) + if ( layerFeatureA.layerId() == layerFeatureB.layerId() && layerFeatureB.feature().id() >= layerFeatureA.feature().id() ) { continue; } QString errMsg; - if ( geomEngineA->overlaps( layerFeatureB.geometry().constGet(), &errMsg ) ) + const QgsGeometry geometryB = layerFeatureB.geometry(); + const QgsAbstractGeometry *geomB = geometryB.constGet(); + if ( geomEngineA->overlaps( geomB, &errMsg ) ) { - std::unique_ptr interGeom( geomEngineA->intersection( layerFeatureB.geometry().constGet() ) ); + std::unique_ptr interGeom( geomEngineA->intersection( geomB ) ); if ( interGeom && !interGeom->isEmpty() ) { QgsGeometryCheckerUtils::filter1DTypes( interGeom.get() ); @@ -105,14 +109,16 @@ void QgsGeometryOverlapCheck::fixError( const QMap &f // Check if error still applies QgsGeometryCheckerUtils::LayerFeature layerFeatureA( featurePoolA, featureA, mContext, true ); QgsGeometryCheckerUtils::LayerFeature layerFeatureB( featurePoolB, featureB, mContext, true ); - std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine( layerFeatureA.geometry().constGet(), mContext->reducedTolerance ); + const QgsGeometry geometryA = layerFeatureA.geometry(); + std::unique_ptr< QgsGeometryEngine > geomEngineA = QgsGeometryCheckerUtils::createGeomEngine( geometryA.constGet(), mContext->reducedTolerance ); - if ( !geomEngineA->overlaps( layerFeatureB.geometry().constGet() ) ) + const QgsGeometry geometryB = layerFeatureB.geometry(); + if ( !geomEngineA->overlaps( geometryB.constGet() ) ) { error->setObsolete(); return; } - std::unique_ptr< QgsAbstractGeometry > interGeom( geomEngineA->intersection( layerFeatureB.geometry().constGet(), &errMsg ) ); + std::unique_ptr< QgsAbstractGeometry > interGeom( geomEngineA->intersection( geometryB.constGet(), &errMsg ) ); if ( !interGeom ) { error->setFixFailed( tr( "Failed to compute intersection between overlapping features: %1" ).arg( errMsg ) ); @@ -153,7 +159,7 @@ void QgsGeometryOverlapCheck::fixError( const QMap &f { QgsGeometryCheckerUtils::filter1DTypes( diff1.get() ); } - std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine( layerFeatureB.geometry().constGet(), mContext->reducedTolerance ); + std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine( geometryB.constGet(), mContext->reducedTolerance ); std::unique_ptr< QgsAbstractGeometry > diff2( geomEngineB->difference( interPart, &errMsg ) ); if ( !diff2 || diff2->isEmpty() ) {