Skip to content

Commit a60324b

Browse files
elpasonyalldawson
authored andcommitted
Accept geometry-less features in a geometry layer
1 parent abcfcfd commit a60324b

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

python/plugins/processing/gui/AlgorithmExecutor.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,17 @@ def make_features_compatible(new_features, input_layer):
120120
new_f_geom_type = QgsWkbTypes.geometryType(new_f.geometry().wkbType())
121121
new_f_has_geom = new_f_geom_type not in (QgsWkbTypes.UnknownGeometry, QgsWkbTypes.NullGeometry)
122122
input_layer_has_geom = input_wkb_type not in (QgsWkbTypes.NoGeometry, QgsWkbTypes.Unknown)
123-
if input_layer_has_geom and not new_f_has_geom:
124-
continue # Skip this feature completely
125-
elif not input_layer_has_geom and new_f_has_geom:
126-
# Drop geometry
123+
124+
# Drop geometry if layer is geometry-less
125+
if not input_layer_has_geom and new_f_has_geom:
127126
f = QgsFeature(input_layer.fields())
128127
f.setAttributes(new_f.attributes())
129128
new_f = f
130129
result_features.append(new_f)
131130
continue # skip the rest
132131

133-
if input_layer_has_geom and new_f.geometry().wkbType() != input_wkb_type: # Fix geometry
132+
if input_layer_has_geom and new_f_has_geom and \
133+
new_f.geometry().wkbType() != input_wkb_type: # Fix geometry
134134
# Single -> Multi
135135
if (QgsWkbTypes.isMultiType(input_wkb_type) and not
136136
new_f.geometry().isMultipart()):

tests/src/python/test_qgsprocessinginplace.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -303,22 +303,31 @@ def test_make_features_compatible_attributes(self):
303303

304304
def test_make_features_compatible_geometry(self):
305305
"""Test corner cases for geometries"""
306+
307+
# Make a feature with no geometry
306308
layer = self._make_layer('Point')
307309
self.assertTrue(layer.isValid())
308310
self.assertTrue(layer.startEditing())
309311
f1 = QgsFeature(layer.fields())
310312
f1.setAttributes([1])
313+
314+
# Check that it is accepted on a Point layer
311315
new_features = make_features_compatible([f1], layer)
312-
self.assertEqual(len(new_features), 0)
316+
self.assertEqual(len(new_features), 1)
317+
self.assertEqual(new_features[0].geometry().asWkt(), '')
313318

319+
# Make a geometry-less layer
314320
nogeom_layer = QgsMemoryProviderUtils.createMemoryLayer(
315321
'nogeom_layer', layer.fields(), QgsWkbTypes.NoGeometry, QgsCoordinateReferenceSystem(4326))
322+
# Check that a geometry-less feature is accepted
316323
new_features = make_features_compatible([f1], nogeom_layer)
317324
self.assertEqual(len(new_features), 1)
318325
self.assertEqual(new_features[0].geometry().asWkt(), '')
319326

327+
# Make a geometry-less layer
320328
nogeom_layer = QgsMemoryProviderUtils.createMemoryLayer(
321329
'nogeom_layer', layer.fields(), QgsWkbTypes.NoGeometry, QgsCoordinateReferenceSystem(4326))
330+
# Check that a Point feature is accepted but geometry was dropped
322331
f1.setGeometry(QgsGeometry.fromWkt('Point(9 45)'))
323332
new_features = make_features_compatible([f1], nogeom_layer)
324333
self.assertEqual(len(new_features), 1)

0 commit comments

Comments
 (0)