Skip to content

Commit 4768025

Browse files
committed
Update multiparts to singleparts to new processing API
1 parent 4dcf8d8 commit 4768025

File tree

3 files changed

+39
-27
lines changed

3 files changed

+39
-27
lines changed

python/plugins/processing/algs/qgis/MultipartToSingleparts.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@
2929

3030
from qgis.PyQt.QtGui import QIcon
3131

32-
from qgis.core import QgsWkbTypes, QgsProcessingUtils
32+
from qgis.core import (QgsWkbTypes,
33+
QgsProcessingUtils,
34+
QgsProcessingParameterFeatureSource,
35+
QgsProcessingParameterFeatureSink,
36+
QgsProcessingOutputVectorLayer)
3337

3438
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3539
from processing.core.parameters import ParameterVector
@@ -51,8 +55,11 @@ def group(self):
5155

5256
def __init__(self):
5357
super().__init__()
54-
self.addParameter(ParameterVector(self.INPUT, self.tr('Input layer')))
55-
self.addOutput(OutputVector(self.OUTPUT, self.tr('Single parts')))
58+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
59+
self.tr('Input layer')))
60+
61+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Single parts')))
62+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr('Single parts')))
5663

5764
def name(self):
5865
return 'multiparttosingleparts'
@@ -61,28 +68,32 @@ def displayName(self):
6168
return self.tr('Multipart to singleparts')
6269

6370
def processAlgorithm(self, parameters, context, feedback):
64-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
65-
geomType = QgsWkbTypes.singleType(layer.wkbType())
71+
source = self.parameterAsSource(parameters, self.INPUT, context)
72+
geomType = QgsWkbTypes.singleType(source.wkbType())
73+
74+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
75+
source.fields(), geomType, source.sourceCrs())
6676

67-
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), geomType, layer.crs(),
68-
context)
77+
features = source.getFeatures()
78+
total = 100.0 / source.featureCount()
6979

70-
features = QgsProcessingUtils.getFeatures(layer, context)
71-
total = 100.0 / QgsProcessingUtils.featureCount(layer, context)
7280
for current, f in enumerate(features):
81+
if feedback.isCanceled():
82+
break
83+
7384
input_geometry = f.geometry()
7485
if input_geometry:
7586
if input_geometry.isMultipart():
7687
for g in input_geometry.asGeometryCollection():
7788
output_feature = f
7889
output_feature.setGeometry(g)
79-
writer.addFeature(output_feature)
90+
sink.addFeature(output_feature)
8091
else:
81-
writer.addFeature(f)
92+
sink.addFeature(f)
8293
else:
8394
#input feature with null geometry
84-
writer.addFeature(f)
95+
sink.addFeature(f)
8596

8697
feedback.setProgress(int(current * total))
8798

88-
del writer
99+
return {self.OUTPUT: dest_id}

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
# from .Delaunay import Delaunay
6767
# from .VoronoiPolygons import VoronoiPolygons
6868
# from .DensifyGeometries import DensifyGeometries
69-
# from .MultipartToSingleparts import MultipartToSingleparts
69+
from .MultipartToSingleparts import MultipartToSingleparts
7070
# from .SimplifyGeometries import SimplifyGeometries
7171
# from .LinesToPolygons import LinesToPolygons
7272
# from .PolygonsToLines import PolygonsToLines
@@ -206,7 +206,7 @@ def getAlgs(self):
206206
# ReprojectLayer(), ExportGeometryInfo(), Centroids(),
207207
# Delaunay(), VoronoiPolygons(), SimplifyGeometries(),
208208
# DensifyGeometries(), DensifyGeometriesInterval(),
209-
# MultipartToSingleparts(), SinglePartsToMultiparts(),
209+
# , SinglePartsToMultiparts(),
210210
# PolygonsToLines(), LinesToPolygons(), ExtractNodes(),
211211
# ConvexHull(), FixedDistanceBuffer(),
212212
# VariableDistanceBuffer(), Dissolve(), Difference(),
@@ -271,7 +271,8 @@ def getAlgs(self):
271271
ExtentFromLayer(),
272272
ExtractByExpression(),
273273
GridPolygon(),
274-
Merge()
274+
Merge(),
275+
MultipartToSingleparts()
275276
]
276277

277278
if hasPlotly:

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,17 @@ tests:
389389
# name: expected/merge_lines.gml
390390
# type: vector
391391
#
392-
# - algorithm: qgis:multiparttosingleparts
393-
# name: Multiparts to singleparts
394-
# params:
395-
# INPUT:
396-
# name: multilines.gml
397-
# type: vector
398-
# results:
399-
# OUTPUT:
400-
# name: expected/multi_to_single.gml
401-
# type: vector
402-
#
392+
- algorithm: qgis:multiparttosingleparts
393+
name: Multiparts to singleparts
394+
params:
395+
INPUT:
396+
name: multilines.gml
397+
type: vector
398+
results:
399+
OUTPUT:
400+
name: expected/multi_to_single.gml
401+
type: vector
402+
403403
- algorithm: qgis:boundingboxes
404404
name: Bounding boxes for lines
405405
params:

0 commit comments

Comments
 (0)