Skip to content

Commit c84f73d

Browse files
committedMar 23, 2021
Merge pull request #42363 from nyalldawson/fix_42350
When running "point on surface" with "create point for each part" option enabled, discard incoming fid fields and regenerate
1 parent cb93e3b commit c84f73d

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed
 

‎src/analysis/processing/qgsalgorithmpointonsurface.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ QString QgsPointOnSurfaceAlgorithm::outputName() const
5050
return QObject::tr( "Point" );
5151
}
5252

53+
QgsFeatureSink::SinkFlags QgsPointOnSurfaceAlgorithm::sinkFlags() const
54+
{
55+
if ( mAllParts )
56+
return QgsProcessingFeatureBasedAlgorithm::sinkFlags() | QgsFeatureSink::RegeneratePrimaryKey;
57+
else
58+
return QgsProcessingFeatureBasedAlgorithm::sinkFlags();
59+
}
60+
5361
QString QgsPointOnSurfaceAlgorithm::shortHelpString() const
5462
{
5563
return QObject::tr( "Returns a point guaranteed to lie on the surface of a geometry." );
@@ -86,7 +94,7 @@ QgsFeatureList QgsPointOnSurfaceAlgorithm::processFeature( const QgsFeature &f,
8694
{
8795
QgsFeatureList list;
8896
QgsFeature feature = f;
89-
if ( feature.hasGeometry() )
97+
if ( feature.hasGeometry() && !feature.geometry().isEmpty() )
9098
{
9199
QgsGeometry geom = feature.geometry();
92100

@@ -98,13 +106,15 @@ QgsFeatureList QgsPointOnSurfaceAlgorithm::processFeature( const QgsFeature &f,
98106
{
99107
const QgsGeometryCollection *geomCollection = static_cast<const QgsGeometryCollection *>( geom.constGet() );
100108

101-
for ( int i = 0; i < geomCollection->partCount(); ++i )
109+
const int partCount = geomCollection->partCount();
110+
list.reserve( partCount );
111+
for ( int i = 0; i < partCount; ++i )
102112
{
103113
QgsGeometry partGeometry( geomCollection->geometryN( i )->clone() );
104114
QgsGeometry outputGeometry = partGeometry.pointOnSurface();
105115
if ( outputGeometry.isNull() )
106116
{
107-
feedback->pushInfo( QObject::tr( "Error calculating point on surface for feature %1 part %2: %3" ).arg( feature.id() ).arg( i ).arg( outputGeometry.lastError() ) );
117+
feedback->reportError( QObject::tr( "Error calculating point on surface for feature %1 part %2: %3" ).arg( feature.id() ).arg( i ).arg( outputGeometry.lastError() ) );
108118
}
109119
feature.setGeometry( outputGeometry );
110120
list << feature;
@@ -115,7 +125,7 @@ QgsFeatureList QgsPointOnSurfaceAlgorithm::processFeature( const QgsFeature &f,
115125
QgsGeometry outputGeometry = feature.geometry().pointOnSurface();
116126
if ( outputGeometry.isNull() )
117127
{
118-
feedback->pushInfo( QObject::tr( "Error calculating point on surface for feature %1: %2" ).arg( feature.id() ).arg( outputGeometry.lastError() ) );
128+
feedback->reportError( QObject::tr( "Error calculating point on surface for feature %1: %2" ).arg( feature.id() ).arg( outputGeometry.lastError() ) );
119129
}
120130
feature.setGeometry( outputGeometry );
121131
list << feature;

‎src/analysis/processing/qgsalgorithmpointonsurface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class QgsPointOnSurfaceAlgorithm : public QgsProcessingFeatureBasedAlgorithm
5151
QString outputName() const override;
5252
QgsProcessing::SourceType outputLayerType() const override { return QgsProcessing::TypeVectorPoint; }
5353
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override { Q_UNUSED( inputWkbType ) return QgsWkbTypes::Point; }
54+
QgsFeatureSink::SinkFlags sinkFlags() const override;
5455

5556
bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5657
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

0 commit comments

Comments
 (0)
Please sign in to comment.