Skip to content

Commit bf078b1

Browse files
committed
[processing] Fix intersection and union tools don't work with
input layers with Z or M values present Also ensure that written geometries are always multitype, to match the created layer geometry type (before the layer was being created as a multi* layer, but single part geometries were sometimes created. This causes errors with some data providers)
1 parent c371b72 commit bf078b1

File tree

2 files changed

+10
-20
lines changed

2 files changed

+10
-20
lines changed

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

+2-10
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,6 @@
4646

4747
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4848

49-
wkbTypeGroups = {
50-
'Point': (QgsWkbTypes.Point, QgsWkbTypes.MultiPoint, QgsWkbTypes.Point25D, QgsWkbTypes.MultiPoint25D,),
51-
'LineString': (QgsWkbTypes.LineString, QgsWkbTypes.MultiLineString, QgsWkbTypes.LineString25D, QgsWkbTypes.MultiLineString25D,),
52-
'Polygon': (QgsWkbTypes.Polygon, QgsWkbTypes.MultiPolygon, QgsWkbTypes.Polygon25D, QgsWkbTypes.MultiPolygon25D,),
53-
}
54-
for key, value in list(wkbTypeGroups.items()):
55-
for const in value:
56-
wkbTypeGroups[const] = key
57-
5849

5950
class Intersection(QgisAlgorithm):
6051

@@ -186,7 +177,8 @@ def processAlgorithm(self, parameters, context, feedback):
186177
'more input features have invalid '
187178
'geometry.'))
188179
try:
189-
if int_geom.wkbType() in wkbTypeGroups[wkbTypeGroups[int_geom.wkbType()]]:
180+
if QgsWkbTypes.geometryType(int_geom.wkbType()) == QgsWkbTypes.geometryType(geomType):
181+
int_geom.convertToMultiType()
190182
outFeat.setGeometry(int_geom)
191183
outFeat.setAttributes(out_attributes)
192184
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)

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

+8-10
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@
4444

4545
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4646

47-
wkbTypeGroups = {
48-
'Point': (QgsWkbTypes.Point, QgsWkbTypes.MultiPoint, QgsWkbTypes.Point25D, QgsWkbTypes.MultiPoint25D,),
49-
'LineString': (QgsWkbTypes.LineString, QgsWkbTypes.MultiLineString, QgsWkbTypes.LineString25D, QgsWkbTypes.MultiLineString25D,),
50-
'Polygon': (QgsWkbTypes.Polygon, QgsWkbTypes.MultiPolygon, QgsWkbTypes.Polygon25D, QgsWkbTypes.MultiPolygon25D,),
51-
}
52-
for key, value in list(wkbTypeGroups.items()):
53-
for const in value:
54-
wkbTypeGroups[const] = key
55-
5647

5748
class Union(QgisAlgorithm):
5849

@@ -113,6 +104,7 @@ def processAlgorithm(self, parameters, context, feedback):
113104
intersects = indexB.intersects(geom.boundingBox())
114105
if len(intersects) < 1:
115106
try:
107+
geom.convertToMultiType()
116108
outFeat.setGeometry(geom)
117109
outFeat.setAttributes(atMapA)
118110
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -149,6 +141,7 @@ def processAlgorithm(self, parameters, context, feedback):
149141
if i.type() == geom.type():
150142
int_geom = QgsGeometry(i)
151143
try:
144+
int_geom.convertToMultiType()
152145
outFeat.setGeometry(int_geom)
153146
outFeat.setAttributes(atMapA + atMapB)
154147
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -159,8 +152,9 @@ def processAlgorithm(self, parameters, context, feedback):
159152
# in geometries of different types
160153
# produced by the intersection
161154
# fix #3549
162-
if int_geom.wkbType() in wkbTypeGroups[wkbTypeGroups[int_geom.wkbType()]]:
155+
if QgsWkbTypes.geometryType(int_geom.wkbType()) == QgsWkbTypes.geometryType(geomType):
163156
try:
157+
int_geom.convertToMultiType()
164158
outFeat.setGeometry(int_geom)
165159
outFeat.setAttributes(atMapA + atMapB)
166160
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -180,6 +174,7 @@ def processAlgorithm(self, parameters, context, feedback):
180174
if i.type() == geom.type():
181175
diff_geom = QgsGeometry(i)
182176
try:
177+
diff_geom.convertToMultiType()
183178
outFeat.setGeometry(diff_geom)
184179
outFeat.setAttributes(atMapA)
185180
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -205,6 +200,7 @@ def processAlgorithm(self, parameters, context, feedback):
205200

206201
if len(intersects) < 1:
207202
try:
203+
geom.convertToMultiType()
208204
outFeat.setGeometry(geom)
209205
outFeat.setAttributes(atMap)
210206
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -229,6 +225,7 @@ def processAlgorithm(self, parameters, context, feedback):
229225
try:
230226
# Ihis only happens if the bounding box
231227
# intersects, but the geometry doesn't
228+
diff_geom.convertToMultiType()
232229
outFeat.setGeometry(diff_geom)
233230
outFeat.setAttributes(atMap)
234231
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -237,6 +234,7 @@ def processAlgorithm(self, parameters, context, feedback):
237234

238235
if add:
239236
try:
237+
diff_geom.convertToMultiType()
240238
outFeat.setGeometry(diff_geom)
241239
outFeat.setAttributes(atMap)
242240
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)

0 commit comments

Comments
 (0)