def processAlgorithm(self, parameters, context, feedback): source = self.parameterAsSource(parameters, self.INPUT, context) if source is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) reference_source = self.parameterAsSource(parameters, self.REFERENCE_LAYER, context) if reference_source is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.REFERENCE_LAYER)) tolerance = self.parameterAsDouble(parameters, self.TOLERANCE, context) mode = self.parameterAsEnum(parameters, self.BEHAVIOR, context) (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context, source.fields(), source.wkbType(), source.sourceCrs()) if sink is None: raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT)) features = source.getFeatures() total = 100.0 / source.featureCount() if source.featureCount() else 0 if parameters[self.INPUT] != parameters[self.REFERENCE_LAYER]: if mode == 7: raise QgsProcessingException(self.tr('This mode applies when the input and reference layer are the same.')) snapper = QgsGeometrySnapper(reference_source) processed = 0 for f in features: if feedback.isCanceled(): break if f.hasGeometry(): out_feature = f out_feature.setGeometry(snapper.snapGeometry(f.geometry(), tolerance, mode)) sink.addFeature(out_feature, QgsFeatureSink.FastInsert) else: sink.addFeature(f) processed += 1 feedback.setProgress(processed * total) elif mode == 7: # input layer == ref layer modified_count = QgsGeometrySnapperSingleSource.run(source, sink, tolerance, feedback) feedback.pushInfo(self.tr('Snapped {} geometries.').format(modified_count)) else: # snapping internally snapper = QgsInternalGeometrySnapper(tolerance, mode) processed = 0 for f in features: if feedback.isCanceled(): break out_feature = f out_feature.setGeometry(snapper.snapFeature(f)) sink.addFeature(out_feature, QgsFeatureSink.FastInsert) processed += 1 feedback.setProgress(processed * total) return {self.OUTPUT: dest_id}
def processAlgorithm(self, parameters, context, feedback): source = self.parameterAsSource(parameters, self.INPUT, context) if source is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) reference_source = self.parameterAsSource(parameters, self.REFERENCE_LAYER, context) if reference_source is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.REFERENCE_LAYER)) tolerance = self.parameterAsDouble(parameters, self.TOLERANCE, context) mode = self.parameterAsEnum(parameters, self.BEHAVIOR, context) (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context, source.fields(), source.wkbType(), source.sourceCrs()) if sink is None: raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT)) features = source.getFeatures() total = 100.0 / source.featureCount() if source.featureCount() else 0 if parameters[self.INPUT] != parameters[self.REFERENCE_LAYER]: if mode == 7: raise QgsProcessingException(self.tr('This mode applies when the input and reference layer are the same.')) snapper = QgsGeometrySnapper(reference_source) processed = 0 for f in features: if feedback.isCanceled(): break if f.hasGeometry(): out_feature = f out_feature.setGeometry(snapper.snapGeometry(f.geometry(), tolerance, mode)) sink.addFeature(out_feature, QgsFeatureSink.FastInsert) else: sink.addFeature(f) processed += 1 feedback.setProgress(processed * total) elif mode == 7: # input layer == ref layer modified_count = QgsGeometrySnapperSingleSource.run(source, sink, tolerance, feedback) feedback.pushInfo(self.tr('Snapped {} geometries.').format(modified_count)) else: # snapping internally snapper = QgsInternalGeometrySnapper(tolerance, mode) processed = 0 for f in features: if feedback.isCanceled(): break out_feature = f out_feature.setGeometry(snapper.snapFeature(f)) sink.addFeature(out_feature, QgsFeatureSink.FastInsert) processed += 1 feedback.setProgress(processed * total) return {self.OUTPUT: dest_id}