def testProxyFeatureSink(self): fields = QgsFields() fields.append(QgsField('fldtxt', QVariant.String)) fields.append(QgsField('fldint', QVariant.Int)) store = QgsFeatureStore(fields, QgsCoordinateReferenceSystem()) proxy = QgsProxyFeatureSink(store) self.assertEqual(proxy.destinationSink(), store) self.assertEqual(len(store), 0) f = QgsFeature() f.setAttributes(["test", 123]) f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(100, 200))) proxy.addFeature(f) self.assertEqual(len(store), 1) self.assertEqual(store.features()[0]['fldtxt'], 'test') f2 = QgsFeature() f2.setAttributes(["test2", 457]) f2.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(200, 200))) f3 = QgsFeature() f3.setAttributes(["test3", 888]) f3.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(300, 200))) proxy.addFeatures([f2, f3]) self.assertEqual(len(store), 3) self.assertEqual(store.features()[1]['fldtxt'], 'test2') self.assertEqual(store.features()[2]['fldtxt'], 'test3')
def testFromIterator(self): """ Test adding features from an iterator :return: """ layer = createLayerWithFivePoints() store = QgsFeatureStore(layer.fields(), layer.crs()) self.assertTrue(store.addFeatures(layer.getFeatures())) vals = [f['fldint'] for f in store.features()] self.assertEqual(vals, [123, 457, 888, -1, 0])
def testRemappingSink(self): """ Test remapping features """ fields = QgsFields() fields.append(QgsField('fldtxt', QVariant.String)) fields.append(QgsField('fldint', QVariant.Int)) fields.append(QgsField('fldtxt2', QVariant.String)) store = QgsFeatureStore(fields, QgsCoordinateReferenceSystem('EPSG:3857')) mapping_def = QgsRemappingSinkDefinition() mapping_def.setDestinationWkbType(QgsWkbTypes.Point) mapping_def.setSourceCrs(QgsCoordinateReferenceSystem('EPSG:4326')) mapping_def.setDestinationCrs( QgsCoordinateReferenceSystem('EPSG:3857')) mapping_def.setDestinationFields(fields) mapping_def.addMappedField('fldtxt2', QgsProperty.fromField('fld1')) mapping_def.addMappedField( 'fldint', QgsProperty.fromExpression('@myval * fldint')) proxy = QgsRemappingProxyFeatureSink(mapping_def, store) self.assertEqual(proxy.destinationSink(), store) self.assertEqual(len(store), 0) incoming_fields = QgsFields() incoming_fields.append(QgsField('fld1', QVariant.String)) incoming_fields.append(QgsField('fldint', QVariant.Int)) context = QgsExpressionContext() scope = QgsExpressionContextScope() scope.setVariable('myval', 2) context.appendScope(scope) context.setFields(incoming_fields) proxy.setExpressionContext(context) proxy.setTransformContext(QgsProject.instance().transformContext()) f = QgsFeature() f.setFields(incoming_fields) f.setAttributes(["test", 123]) f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(1, 2))) self.assertTrue(proxy.addFeature(f)) self.assertEqual(len(store), 1) self.assertEqual(store.features()[0].geometry().asWkt(1), 'Point (111319.5 222684.2)') self.assertEqual(store.features()[0].attributes(), [None, 246, 'test']) f2 = QgsFeature() f2.setAttributes(["test2", 457]) f2.setGeometry(QgsGeometry.fromWkt('LineString( 1 1, 2 2)')) f3 = QgsFeature() f3.setAttributes(["test3", 888]) f3.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(3, 4))) self.assertTrue(proxy.addFeatures([f2, f3])) self.assertEqual(len(store), 4) self.assertEqual(store.features()[1].attributes(), [None, 914, 'test2']) self.assertEqual(store.features()[2].attributes(), [None, 914, 'test2']) self.assertEqual(store.features()[3].attributes(), [None, 1776, 'test3']) self.assertEqual(store.features()[1].geometry().asWkt(1), 'Point (111319.5 111325.1)') self.assertEqual(store.features()[2].geometry().asWkt(1), 'Point (222639 222684.2)') self.assertEqual(store.features()[3].geometry().asWkt(1), 'Point (333958.5 445640.1)')