Skip to content

Commit c5cb3df

Browse files
committedJul 28, 2017
Port singlepart to multipart to new API, fix disabled test
1 parent 2a6f512 commit c5cb3df

File tree

4 files changed

+50
-44
lines changed

4 files changed

+50
-44
lines changed
 

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
from .ShortestPathPointToLayer import ShortestPathPointToLayer
112112
from .ShortestPathPointToPoint import ShortestPathPointToPoint
113113
from .SimplifyGeometries import SimplifyGeometries
114+
from .SinglePartsToMultiparts import SinglePartsToMultiparts
114115
from .SingleSidedBuffer import SingleSidedBuffer
115116
from .Slope import Slope
116117
from .Smooth import Smooth
@@ -130,7 +131,6 @@
130131
from .ZonalStatistics import ZonalStatistics
131132

132133
# from .ExtractByLocation import ExtractByLocation
133-
# from .SinglePartsToMultiparts import SinglePartsToMultiparts
134134
# from .ConvexHull import ConvexHull
135135
# from .FixedDistanceBuffer import FixedDistanceBuffer
136136
# from .VariableDistanceBuffer import VariableDistanceBuffer
@@ -185,7 +185,6 @@ def __init__(self):
185185

186186
def getAlgs(self):
187187
# algs = [
188-
# SinglePartsToMultiparts(),
189188
# ConvexHull(), FixedDistanceBuffer(),
190189
# VariableDistanceBuffer(),
191190
# RandomSelection(), RandomSelectionWithinSubsets(),
@@ -285,6 +284,7 @@ def getAlgs(self):
285284
ShortestPathPointToLayer(),
286285
ShortestPathPointToPoint(),
287286
SimplifyGeometries(),
287+
SinglePartsToMultiparts(),
288288
SingleSidedBuffer(),
289289
Slope(),
290290
Smooth(),

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

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@
3030

3131
from qgis.PyQt.QtGui import QIcon
3232

33-
from qgis.core import QgsFeature, QgsFeatureSink, QgsGeometry, QgsWkbTypes, QgsProcessingUtils, NULL
33+
from qgis.core import (QgsFeature,
34+
QgsFeatureSink,
35+
QgsGeometry,
36+
QgsWkbTypes,
37+
QgsProcessingUtils,
38+
NULL,
39+
QgsProcessingParameterFeatureSource,
40+
QgsProcessingParameterField,
41+
QgsProcessingParameterFeatureSink)
3442

3543
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
36-
from processing.core.parameters import ParameterVector
37-
from processing.core.parameters import ParameterTableField
38-
from processing.core.outputs import OutputVector
3944

4045
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4146

@@ -56,11 +61,12 @@ def __init__(self):
5661
super().__init__()
5762

5863
def initAlgorithm(self, config=None):
59-
self.addParameter(ParameterVector(self.INPUT, self.tr('Input layer')))
60-
self.addParameter(ParameterTableField(self.FIELD,
61-
self.tr('Unique ID field'), self.INPUT))
64+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
65+
self.tr('Input layer')))
66+
self.addParameter(QgsProcessingParameterField(self.FIELD,
67+
self.tr('Unique ID field'), parentLayerParameterName=self.INPUT))
6268

63-
self.addOutput(OutputVector(self.OUTPUT, self.tr('Multipart')))
69+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Multipart')))
6470

6571
def name(self):
6672
return 'singlepartstomultipart'
@@ -69,31 +75,29 @@ def displayName(self):
6975
return self.tr('Singleparts to multipart')
7076

7177
def processAlgorithm(self, parameters, context, feedback):
72-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
73-
fieldName = self.getParameterValue(self.FIELD)
78+
source = self.parameterAsSource(parameters, self.INPUT, context)
79+
field_name = self.parameterAsString(parameters, self.FIELD, context)
7480

75-
geomType = QgsWkbTypes.multiType(layer.wkbType())
81+
geom_type = QgsWkbTypes.multiType(source.wkbType())
7682

77-
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), geomType, layer.crs(),
78-
context)
83+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
84+
source.fields(), geom_type, source.sourceCrs())
7985

80-
outFeat = QgsFeature()
81-
inGeom = QgsGeometry()
82-
83-
index = layer.fields().lookupField(fieldName)
86+
index = source.fields().lookupField(field_name)
8487

8588
collection_geom = {}
8689
collection_attrs = {}
8790

88-
features = QgsProcessingUtils.getFeatures(layer, context)
89-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
91+
features = source.getFeatures()
92+
total = 100.0 / source.featureCount() if source.featureCount() else 0
9093
for current, feature in enumerate(features):
94+
if feedback.isCanceled():
95+
break
96+
9197
atMap = feature.attributes()
9298
idVar = atMap[index]
93-
if idVar in [None, NULL]:
94-
outFeat.setAttributes(atMap)
95-
outFeat.setGeometry(feature.geometry())
96-
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
99+
if idVar in [None, NULL] or not feature.hasGeometry():
100+
sink.addFeature(feature, QgsFeatureSink.FastInsert)
97101
feedback.setProgress(int(current * total))
98102
continue
99103

@@ -108,8 +112,12 @@ def processAlgorithm(self, parameters, context, feedback):
108112
feedback.setProgress(int(current * total))
109113

110114
for key, geoms in collection_geom.items():
111-
outFeat.setAttributes(collection_attrs[key])
112-
outFeat.setGeometry(QgsGeometry.collectGeometry(geoms))
113-
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
115+
if feedback.isCanceled():
116+
break
117+
118+
feature = QgsFeature()
119+
feature.setAttributes(collection_attrs[key])
120+
feature.setGeometry(QgsGeometry.collectGeometry(geoms))
121+
sink.addFeature(feature, QgsFeatureSink.FastInsert)
114122

115-
del writer
123+
return {self.OUTPUT: dest_id}

‎python/plugins/processing/tests/testdata/expected/single_to_multi.gfs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<GeometryType>6</GeometryType>
77
<SRSName>EPSG:4326</SRSName>
88
<DatasetSpecificInfo>
9-
<FeatureCount>4</FeatureCount>
9+
<FeatureCount>5</FeatureCount>
1010
<ExtentXMin>0.21020</ExtentXMin>
1111
<ExtentXMax>8.96288</ExtentXMax>
1212
<ExtentYMin>-5.48232</ExtentYMin>

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,20 +2363,18 @@ tests:
23632363
name: expected/mean_coordinates.gml
23642364
type: vector
23652365

2366-
# # Temporarily disable until we figure out why it failed after merging
2367-
# # into master
2368-
# #- algorithm: qgis:singlepartstomultipart
2369-
# # name: single part to multipart
2370-
# # params:
2371-
# # FIELD: id
2372-
# # INPUT:
2373-
# # name: custom/single_part_poly.gml
2374-
# # type: vector
2375-
# # results:
2376-
# # OUTPUT:
2377-
# # name: expected/single_to_multi.gml
2378-
# # type: vector
2379-
#
2366+
- algorithm: qgis:singlepartstomultipart
2367+
name: single part to multipart
2368+
params:
2369+
FIELD: id
2370+
INPUT:
2371+
name: custom/single_part_poly.gml
2372+
type: vector
2373+
results:
2374+
OUTPUT:
2375+
name: expected/single_to_multi.gml
2376+
type: vector
2377+
23802378
# - algorithm: qgis:zonalstatistics
23812379
# name: simple zonal statistics
23822380
# params:

0 commit comments

Comments
 (0)