Skip to content

Commit 7ac3d0e

Browse files
authoredNov 1, 2018
Merge pull request #8392 from m-kuhn/mergeDuplicateFidBackport
Processing: GeoPackage output, regenerate fid when there's a risk of duplicates
2 parents 891c16a + 1ad4123 commit 7ac3d0e

28 files changed

+236
-51
lines changed
 

‎python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ Evaluates the parameter with matching ``name`` to a static boolean value.
611611
%End
612612

613613
QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier /Out/,
614-
const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem() ) const /Factory/;
614+
const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem(), QgsFeatureSink::SinkFlags sinkFlags = 0 ) const /Factory/;
615615
%Docstring
616616
Evaluates the parameter with matching ``name`` to a feature sink.
617617

@@ -922,6 +922,13 @@ this is possible to determine in advance.
922922
virtual QgsProcessingFeatureSource::Flag sourceFlags() const;
923923
%Docstring
924924
Returns the processing feature source flags to be used in the algorithm.
925+
%End
926+
927+
virtual QgsFeatureSink::SinkFlags sinkFlags() const;
928+
%Docstring
929+
Returns the feature sink flags to be used for the output.
930+
931+
.. versionadded:: 3.4.1
925932
%End
926933

927934
virtual QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const;

‎python/core/auto_generated/processing/qgsprocessingparameters.sip.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ Evaluates the parameter with matching ``definition`` and ``value`` to a static b
588588

589589
static QgsFeatureSink *parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariantMap &parameters,
590590
const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs,
591-
QgsProcessingContext &context, QString &destinationIdentifier /Out/ ) /Factory/;
591+
QgsProcessingContext &context, QString &destinationIdentifier /Out/, QgsFeatureSink::SinkFlags sinkFlags = 0 ) /Factory/;
592592
%Docstring
593593
Evaluates the parameter with matching ``definition`` to a feature sink.
594594

@@ -605,7 +605,7 @@ This function creates a new object and the caller takes responsibility for delet
605605

606606
static QgsFeatureSink *parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value,
607607
const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs,
608-
QgsProcessingContext &context, QString &destinationIdentifier /Out/ ) /Factory/;
608+
QgsProcessingContext &context, QString &destinationIdentifier /Out/, QgsFeatureSink::SinkFlags sinkFlags = 0 ) /Factory/;
609609
%Docstring
610610
Evaluates the parameter with matching ``definition`` and ``value`` to a feature sink.
611611

‎python/core/auto_generated/qgsfeaturesink.sip.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ An interface for objects which accept features via addFeature(s) methods.
2222
%End
2323
public:
2424

25+
enum SinkFlag
26+
{
27+
28+
RegeneratePrimaryKey,
29+
};
30+
typedef QFlags<QgsFeatureSink::SinkFlag> SinkFlags;
31+
32+
2533
enum Flag
2634
{
2735

‎python/core/auto_generated/qgsvectorfilewriter.sip.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,8 @@ Writes a layer out to a vector file.
408408
const QStringList &datasourceOptions = QStringList(),
409409
const QStringList &layerOptions = QStringList(),
410410
QString *newFilename = 0,
411-
QgsVectorFileWriter::SymbologyExport symbologyExport = QgsVectorFileWriter::NoSymbology
411+
QgsVectorFileWriter::SymbologyExport symbologyExport = QgsVectorFileWriter::NoSymbology,
412+
QgsFeatureSink::SinkFlags sinkFlags = 0
412413
);
413414

414415

‎python/core/auto_generated/qgsvectorlayerexporter.sip.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ Writes the contents of vector layer to a different datasource.
7777
QgsWkbTypes::Type geometryType,
7878
const QgsCoordinateReferenceSystem &crs,
7979
bool overwrite = false,
80-
const QMap<QString, QVariant> &options = QMap<QString, QVariant>() );
80+
const QMap<QString, QVariant> &options = QMap<QString, QVariant>(),
81+
QgsFeatureSink::SinkFlags sinkFlags = 0 );
8182
%Docstring
8283
Constructor for QgsVectorLayerExporter.
8384

@@ -89,6 +90,7 @@ Constructor for QgsVectorLayerExporter.
8990
not available
9091
:param overwrite: set to true to overwrite any existing data source
9192
:param options: optional provider dataset options
93+
:param sinkFlags: for how to add features
9294
%End
9395

9496

‎python/plugins/processing/algs/qgis/PointsAlongGeometry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def processAlgorithm(self, parameters, context, feedback):
107107
fields.append(QgsField('angle', QVariant.Double))
108108

109109
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
110-
fields, QgsWkbTypes.Point, source.sourceCrs())
110+
fields, QgsWkbTypes.Point, source.sourceCrs(), QgsFeatureSink.RegeneratePrimaryKey)
111111
if sink is None:
112112
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
113113

‎python/plugins/processing/algs/qgis/SpatialJoin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,12 @@ def processAlgorithm(self, parameters, context, feedback):
184184
out_fields = QgsProcessingUtils.combineFields(source_fields, fields_to_join)
185185

186186
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
187-
out_fields, source.wkbType(), source.sourceCrs())
187+
out_fields, source.wkbType(), source.sourceCrs(), QgsFeatureSink.RegeneratePrimaryKey)
188188
if self.OUTPUT in parameters and parameters[self.OUTPUT] is not None and sink is None:
189189
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
190190

191191
(non_matching_sink, non_matching_dest_id) = self.parameterAsSink(parameters, self.NON_MATCHING, context,
192-
source.fields(), source.wkbType(), source.sourceCrs())
192+
source.fields(), source.wkbType(), source.sourceCrs(), QgsFeatureSink.RegeneratePrimaryKey)
193193
if self.NON_MATCHING in parameters and parameters[self.NON_MATCHING] is not None and non_matching_sink is None:
194194
raise QgsProcessingException(self.invalidSinkError(parameters, self.NON_MATCHING))
195195

‎python/plugins/processing/tests/AlgorithmsTestBase.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import glob
3737
import hashlib
3838
import tempfile
39+
import re
3940

4041
from osgeo.gdalconst import GA_ReadOnly
4142
from numpy import nan_to_num
@@ -199,7 +200,8 @@ def load_result_param(self, param):
199200
basename = os.path.basename(param['name'])
200201
else:
201202
basename = os.path.basename(param['name'][0])
202-
filepath = os.path.join(outdir, basename)
203+
204+
filepath = self.uri_path_join(outdir, basename)
203205
return filepath
204206
elif param['type'] == 'rasterhash':
205207
outdir = tempfile.mkdtemp()
@@ -215,13 +217,14 @@ def load_result_param(self, param):
215217

216218
def load_layers(self, id, param):
217219
layers = []
218-
if param['type'] in ('vector', 'table') and isinstance(param['name'], str):
219-
layers.append(self.load_layer(id, param))
220-
elif param['type'] in ('vector', 'table'):
221-
for n in param['name']:
222-
layer_param = deepcopy(param)
223-
layer_param['name'] = n
224-
layers.append(self.load_layer(id, layer_param))
220+
if param['type'] in ('vector', 'table'):
221+
if isinstance(param['name'], str) or 'uri' in param:
222+
layers.append(self.load_layer(id, param))
223+
else:
224+
for n in param['name']:
225+
layer_param = deepcopy(param)
226+
layer_param['name'] = n
227+
layers.append(self.load_layer(id, layer_param))
225228
else:
226229
layers.append(self.load_layer(id, param))
227230
return layers
@@ -230,6 +233,7 @@ def load_layer(self, id, param):
230233
"""
231234
Loads a layer which was specified as parameter.
232235
"""
236+
233237
filepath = self.filepath_from_param(param)
234238

235239
if 'in_place' in param and param['in_place']:
@@ -268,7 +272,22 @@ def filepath_from_param(self, param):
268272
if 'location' in param and param['location'] == 'qgs':
269273
prefix = unitTestDataPath()
270274

271-
return os.path.join(prefix, param['name'])
275+
if 'uri' in param:
276+
path = param['uri']
277+
else:
278+
path = param['name']
279+
280+
return self.uri_path_join(prefix, path)
281+
282+
def uri_path_join(self, prefix, filepath):
283+
if filepath.startswith('ogr:'):
284+
if not prefix[-1] == os.path.sep:
285+
prefix += os.path.sep
286+
filepath = re.sub(r"dbname='", "dbname='{}".format(prefix), filepath)
287+
else:
288+
filepath = os.path.join(prefix, filepath)
289+
290+
return filepath
272291

273292
def check_results(self, results, context, params, expected):
274293
"""
Binary file not shown.
Binary file not shown.

‎python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6232,5 +6232,28 @@ tests:
62326232
name: expected/interpolate_point_polys.gml
62336233
type: vector
62346234

6235+
- algorithm: native:mergevectorlayers
6236+
name: Merge vector layers with conflicting feature ids
6237+
params:
6238+
LAYERS:
6239+
params:
6240+
- name: custom/pol.gpkg|layername=pol1
6241+
type: vector
6242+
- name: custom/pol.gpkg|layername=pol2
6243+
type: vector
6244+
- name: custom/pol.gpkg|layername=pol3
6245+
type: vector
6246+
type: multi
6247+
results:
6248+
OUTPUT:
6249+
# If you ever run into this test producing Polygons instead of MultiPolygons as output
6250+
# that is totally expected and you are invited to replace the file merged_pol.gpkg with
6251+
# a single polygon version.
6252+
name: ogr:dbname='expected/merged_pol.gpkg' table="output" (geom) sql=
6253+
uri: expected/merged_pol.gpkg|layername=merged_pol
6254+
type: vector
6255+
compare:
6256+
fields:
6257+
path: skip
62356258

62366259
# See ../README.md for a description of the file format

‎src/analysis/processing/qgsalgorithmjoinbyattribute.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,13 @@ QVariantMap QgsJoinByAttributeAlgorithm::processAlgorithm( const QVariantMap &pa
165165

166166
QString dest;
167167
std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, outFields,
168-
input->wkbType(), input->sourceCrs() ) );
168+
input->wkbType(), input->sourceCrs(), QgsFeatureSink::RegeneratePrimaryKey ) );
169169
if ( parameters.value( QStringLiteral( "OUTPUT" ) ).isValid() && !sink )
170170
throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
171171

172172
QString destNonMatching1;
173173
std::unique_ptr< QgsFeatureSink > sinkNonMatching1( parameterAsSink( parameters, QStringLiteral( "NON_MATCHING" ), context, destNonMatching1, input->fields(),
174-
input->wkbType(), input->sourceCrs() ) );
174+
input->wkbType(), input->sourceCrs(), QgsFeatureSink::RegeneratePrimaryKey ) );
175175
if ( parameters.value( QStringLiteral( "NON_MATCHING" ) ).isValid() && !sinkNonMatching1 )
176176
throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "NON_MATCHING" ) ) );
177177

‎src/analysis/processing/qgsalgorithmmergevector.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ QVariantMap QgsMergeVectorAlgorithm::processAlgorithm( const QVariantMap &parame
178178
}
179179

180180
QString dest;
181-
std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, outputFields, outputType, outputCrs ) );
181+
std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, outputFields, outputType, outputCrs, QgsFeatureSink::RegeneratePrimaryKey ) );
182182
if ( !sink )
183183
throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
184184

‎src/analysis/processing/qgsalgorithmmultiparttosinglepart.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ QgsProcessingFeatureSource::Flag QgsMultipartToSinglepartAlgorithm::sourceFlags(
7474
return QgsProcessingFeatureSource::FlagSkipGeometryValidityChecks;
7575
}
7676

77+
QgsFeatureSink::SinkFlags QgsMultipartToSinglepartAlgorithm::sinkFlags() const
78+
{
79+
return QgsFeatureSink::RegeneratePrimaryKey;
80+
}
81+
7782
QgsFeatureList QgsMultipartToSinglepartAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
7883
{
7984
if ( !feature.hasGeometry() )

‎src/analysis/processing/qgsalgorithmmultiparttosinglepart.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class QgsMultipartToSinglepartAlgorithm : public QgsProcessingFeatureBasedAlgori
4949
protected:
5050

5151
QgsProcessingFeatureSource::Flag sourceFlags() const override;
52+
QgsFeatureSink::SinkFlags sinkFlags() const override;
5253
QgsFeatureList processFeature( const QgsFeature &feature,
5354
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5455

‎src/app/qgsgeometryvalidationservice.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,9 @@ void QgsGeometryValidationService::processFeature( QgsVectorLayer *layer, QgsFea
348348
if ( !allErrors.empty() )
349349
mLayerChecks[layer].singleFeatureCheckErrors.insert( fid, allErrors );
350350

351+
if ( !mLayerChecks[layer].singleFeatureCheckErrors.empty() )
352+
layer->setAllowCommit( false );
353+
351354
emit geometryCheckCompleted( layer, fid, allErrors );
352355
}
353356

@@ -432,7 +435,7 @@ void QgsGeometryValidationService::triggerTopologyChecks( QgsVectorLayer *layer
432435
connect( futureWatcher, &QFutureWatcherBase::finished, this, [&allErrors, layer, feedbacks, futureWatcher, this]()
433436
{
434437
QgsReadWriteLocker errorLocker( mTopologyCheckLock, QgsReadWriteLocker::Read );
435-
layer->setAllowCommit( allErrors.empty() );
438+
layer->setAllowCommit( allErrors.empty() && mLayerChecks[layer].singleFeatureCheckErrors.empty() );
436439
errorLocker.unlock();
437440
qDeleteAll( feedbacks.values() );
438441
futureWatcher->deleteLater();

‎src/core/processing/qgsprocessingalgorithm.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -586,9 +586,9 @@ bool QgsProcessingAlgorithm::parameterAsBool( const QVariantMap &parameters, con
586586
return QgsProcessingParameters::parameterAsBool( parameterDefinition( name ), parameters, context );
587587
}
588588

589-
QgsFeatureSink *QgsProcessingAlgorithm::parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs ) const
589+
QgsFeatureSink *QgsProcessingAlgorithm::parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, QgsFeatureSink::SinkFlags sinkFlags ) const
590590
{
591-
return QgsProcessingParameters::parameterAsSink( parameterDefinition( name ), parameters, fields, geometryType, crs, context, destinationIdentifier );
591+
return QgsProcessingParameters::parameterAsSink( parameterDefinition( name ), parameters, fields, geometryType, crs, context, destinationIdentifier, sinkFlags );
592592
}
593593

594594
QgsProcessingFeatureSource *QgsProcessingAlgorithm::parameterAsSource( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const
@@ -824,6 +824,11 @@ QgsProcessingFeatureSource::Flag QgsProcessingFeatureBasedAlgorithm::sourceFlags
824824
return static_cast<QgsProcessingFeatureSource::Flag>( 0 );
825825
}
826826

827+
QgsFeatureSink::SinkFlags QgsProcessingFeatureBasedAlgorithm::sinkFlags() const
828+
{
829+
return nullptr;
830+
}
831+
827832
QgsWkbTypes::Type QgsProcessingFeatureBasedAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const
828833
{
829834
return inputWkbType;
@@ -858,7 +863,8 @@ QVariantMap QgsProcessingFeatureBasedAlgorithm::processAlgorithm( const QVariant
858863
std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest,
859864
outputFields( mSource->fields() ),
860865
outputWkbType( mSource->wkbType() ),
861-
outputCrs( mSource->sourceCrs() ) ) );
866+
outputCrs( mSource->sourceCrs() ),
867+
sinkFlags() ) );
862868
if ( !sink )
863869
throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
864870

‎src/core/processing/qgsprocessingalgorithm.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ class CORE_EXPORT QgsProcessingAlgorithm
619619
* This function creates a new object and the caller takes responsibility for deleting the returned object.
620620
*/
621621
QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier SIP_OUT,
622-
const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem() ) const SIP_FACTORY;
622+
const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem(), QgsFeatureSink::SinkFlags sinkFlags = nullptr ) const SIP_FACTORY;
623623

624624
/**
625625
* Evaluates the parameter with matching \a name to a feature source.
@@ -929,6 +929,13 @@ class CORE_EXPORT QgsProcessingFeatureBasedAlgorithm : public QgsProcessingAlgor
929929
*/
930930
virtual QgsProcessingFeatureSource::Flag sourceFlags() const;
931931

932+
/**
933+
* Returns the feature sink flags to be used for the output.
934+
*
935+
* \since QGIS 3.4.1
936+
*/
937+
virtual QgsFeatureSink::SinkFlags sinkFlags() const;
938+
932939
/**
933940
* Maps the input WKB geometry type (\a inputWkbType) to the corresponding
934941
* output WKB type generated by the algorithm. The default behavior is that the algorithm maintains

‎src/core/processing/qgsprocessingparameters.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -350,18 +350,18 @@ bool QgsProcessingParameters::parameterAsBool( const QgsProcessingParameterDefin
350350

351351
QgsFeatureSink *QgsProcessingParameters::parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariantMap &parameters, const QgsFields &fields,
352352
QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs,
353-
QgsProcessingContext &context, QString &destinationIdentifier )
353+
QgsProcessingContext &context, QString &destinationIdentifier, QgsFeatureSink::SinkFlags sinkFlags )
354354
{
355355
QVariant val;
356356
if ( definition )
357357
{
358358
val = parameters.value( definition->name() );
359359
}
360360

361-
return parameterAsSink( definition, val, fields, geometryType, crs, context, destinationIdentifier );
361+
return parameterAsSink( definition, val, fields, geometryType, crs, context, destinationIdentifier, sinkFlags );
362362
}
363363

364-
QgsFeatureSink *QgsProcessingParameters::parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, QgsProcessingContext &context, QString &destinationIdentifier )
364+
QgsFeatureSink *QgsProcessingParameters::parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, QgsProcessingContext &context, QString &destinationIdentifier, QgsFeatureSink::SinkFlags sinkFlags )
365365
{
366366
QVariant val = value;
367367

@@ -374,6 +374,7 @@ QgsFeatureSink *QgsProcessingParameters::parameterAsSink( const QgsProcessingPar
374374
QgsProcessingOutputLayerDefinition fromVar = qvariant_cast<QgsProcessingOutputLayerDefinition>( val );
375375
destinationProject = fromVar.destinationProject;
376376
createOptions = fromVar.createOptions;
377+
377378
val = fromVar.sink;
378379
destName = fromVar.destinationName;
379380
}
@@ -401,7 +402,7 @@ QgsFeatureSink *QgsProcessingParameters::parameterAsSink( const QgsProcessingPar
401402
if ( dest.isEmpty() )
402403
return nullptr;
403404

404-
std::unique_ptr< QgsFeatureSink > sink( QgsProcessingUtils::createFeatureSink( dest, context, fields, geometryType, crs, createOptions ) );
405+
std::unique_ptr< QgsFeatureSink > sink( QgsProcessingUtils::createFeatureSink( dest, context, fields, geometryType, crs, createOptions, sinkFlags ) );
405406
destinationIdentifier = dest;
406407

407408
if ( destinationProject )
@@ -4580,4 +4581,3 @@ bool QgsProcessingParameterDistance::fromVariantMap( const QVariantMap &map )
45804581
mParentParameterName = map.value( QStringLiteral( "parent" ) ).toString();
45814582
return true;
45824583
}
4583-

0 commit comments

Comments
 (0)
Please sign in to comment.