Skip to content

Commit b56e46d

Browse files
committed
[processing] handle NULL values in the single to multi algorithm (fix #15822)
1 parent 2f70b42 commit b56e46d

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
from qgis.PyQt.QtGui import QIcon
3232

33-
from qgis.core import QgsFeature, QgsGeometry, QgsWkbTypes, QgsProcessingUtils
33+
from qgis.core import QgsFeature, QgsGeometry, QgsWkbTypes, QgsProcessingUtils, NULL
3434

3535
from processing.core.GeoAlgorithm import GeoAlgorithm
3636
from processing.core.parameters import ParameterVector
@@ -87,6 +87,13 @@ def processAlgorithm(self, context, feedback):
8787
for current, feature in enumerate(features):
8888
atMap = feature.attributes()
8989
idVar = atMap[index]
90+
if idVar in [None, NULL]:
91+
outFeat.setAttributes(atMap)
92+
outFeat.setGeometry(feature.geometry())
93+
writer.addFeature(outFeat)
94+
feedback.setProgress(int(current * total))
95+
continue
96+
9097
key = str(idVar).strip()
9198
if key not in collection_geom:
9299
collection_geom[key] = []

python/plugins/processing/tests/testdata/custom/single_part_poly.gml

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
<gml:coord><gml:X>8.962880985074626</gml:X><gml:Y>7.163993643533122</gml:Y></gml:coord>
1111
</gml:Box>
1212
</gml:boundedBy>
13-
13+
1414
<gml:featureMember>
1515
<ogr:single_part_poly fid="single_part_poly.0">
1616
<ogr:geometryProperty><gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0.80194134384858,7.16399364353312 0.672499728706625,4.76932376340694 5.20295625867508,4.2839177066246 5.26276665671642,6.74081294029851 0.80194134384858,7.16399364353312</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogr:geometryProperty>
17-
<ogr:id>1</ogr:id>
17+
<ogr:id></ogr:id>
1818
</ogr:single_part_poly>
1919
</gml:featureMember>
2020
<gml:featureMember>

python/plugins/processing/tests/testdata/expected/single_to_multi.gml

+13-8
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,26 @@
1111
</gml:Box>
1212
</gml:boundedBy>
1313

14+
<gml:featureMember>
15+
<ogr:single_to_multi fid="single_part_poly.0">
16+
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0.80194134384858,7.16399364353312 0.672499728706625,4.76932376340694 5.20295625867508,4.2839177066246 5.26276665671642,6.74081294029851 0.80194134384858,7.16399364353312</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
17+
</ogr:single_to_multi>
18+
</gml:featureMember>
1419
<gml:featureMember>
1520
<ogr:single_to_multi fid="single_part_poly.6">
1621
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0.210196746268657,2.19860362686567 0.439859014925373,1.05029228358209 1.15436385074627,1.02477425373134 0.720557343283582,4.0359017761194 0.210196746268657,2.19860362686567</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
1722
<ogr:id>4</ogr:id>
1823
</ogr:single_to_multi>
1924
</gml:featureMember>
2025
<gml:featureMember>
21-
<ogr:single_to_multi fid="single_part_poly.0">
22-
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0.80194134384858,7.16399364353312 0.672499728706625,4.76932376340694 5.20295625867508,4.2839177066246 5.26276665671642,6.74081294029851 0.80194134384858,7.16399364353312</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>6.30900588059701,4.21452798507463 6.00278952238806,2.60689210447761 8.4525203880597,1.81583317910448 8.96288098507463,4.26556404477612 8.24837614925373,7.04702929850746 6.30900588059701,4.21452798507463</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>3.96134713432836,1.68824302985075 3.93582910447761,-1.14425828358209 8.27389417910448,-1.50151070149254 8.120786,0.64200380597015 3.96134713432836,1.68824302985075</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
26+
<ogr:single_to_multi fid="single_part_poly.5">
27+
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0.592967194029851,-0.17457314925373 1.58817035820896,-2.06290735820895 2.37922928358209,-1.3739205522388 2.63440958208955,0.284751388059703 0.592967194029851,-0.17457314925373</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
28+
<ogr:id>3</ogr:id>
29+
</ogr:single_to_multi>
30+
</gml:featureMember>
31+
<gml:featureMember>
32+
<ogr:single_to_multi fid="single_part_poly.1">
33+
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>6.30900588059701,4.21452798507463 6.00278952238806,2.60689210447761 8.4525203880597,1.81583317910448 8.96288098507463,4.26556404477612 8.24837614925373,7.04702929850746 6.30900588059701,4.21452798507463</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>3.96134713432836,1.68824302985075 3.93582910447761,-1.14425828358209 8.27389417910448,-1.50151070149254 8.120786,0.64200380597015 3.96134713432836,1.68824302985075</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
2334
<ogr:id>1</ogr:id>
2435
</ogr:single_to_multi>
2536
</gml:featureMember>
@@ -29,10 +40,4 @@
2940
<ogr:id>2</ogr:id>
3041
</ogr:single_to_multi>
3142
</gml:featureMember>
32-
<gml:featureMember>
33-
<ogr:single_to_multi fid="single_part_poly.5">
34-
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0.592967194029851,-0.17457314925373 1.58817035820896,-2.06290735820895 2.37922928358209,-1.3739205522388 2.63440958208955,0.284751388059703 0.592967194029851,-0.17457314925373</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
35-
<ogr:id>3</ogr:id>
36-
</ogr:single_to_multi>
37-
</gml:featureMember>
3843
</ogr:FeatureCollection>

0 commit comments

Comments
 (0)