def get_transformed_layers(self): transformed_layers = [] for background_layer in self.layers_to_transform: _t = QgsWkbTypes.displayString(background_layer.wkbType()) result_layer = QgsVectorLayer( "{}?crs={}".format(_t, background_layer.crs().authid()), "result_cartogram", "memory") features_to_add = [] result_layer.setCrs(background_layer.crs()) pr_result_layer = result_layer.dataProvider() pr_result_layer.addAttributes(background_layer.fields().toList()) result_layer.updateFields() for ix, ft in enumerate(background_layer.getFeatures()): ref_geom = ft.geometry() ref_coords = ref_geom.__geo_interface__['coordinates'] if ref_geom.__geo_interface__['type'] == 'LineString': new_geom = QgsGeometry.fromPolyLineXY([ QgsPointXY(*self.g._interp_point( *ref_coords[ix_coords])) for ix_coords in range(len(ref_coords)) ]) elif ref_geom.__geo_interface__['type'] == 'MultiLineString': lines = [] for ix_line in range(len(ref_coords)): lines.append([ QgsPointXY(*self.g._interp_point( *ref_coords[ix_line][ix_coords])) for ix_coords in range(len(ref_coords[ix_line])) ]) new_geom = QgsGeometry.fromMultiPolylineXY(lines) elif ref_geom.__geo_interface__['type'] == 'Polygon': rings = [] for ix_ring in range(len(ref_coords)): rings.append([ QgsPointXY(*self.g._interp_point( *ref_coords[ix_ring][ix_coords])) for ix_coords in range(len(ref_coords[ix_ring])) ]) new_geom = QgsGeometry.fromPolygonXY(rings) elif ref_geom.__geo_interface__['type'] == 'MultiPolygon': polys = [] for ix_poly in range(len(ref_coords)): rings = [] for ix_ring in range(len(ref_coords[ix_poly])): rings.append([ QgsPointXY(*self.g._interp_point( *ref_coords[ix_poly][ix_ring][ix_coords])) for ix_coords in range( len(ref_coords[ix_poly][ix_ring])) ]) polys.append(rings) new_geom = QgsGeometry.fromMultiPolygonXY(polys) else: self.status.emit('Geometry type error') continue feature = QgsFeature() feature.setGeometry(new_geom) feature.setAttributes(ft.attributes()) features_to_add.append(feature) self.progress.emit(1) pr_result_layer.addFeatures(features_to_add) result_layer.updateExtents() transformed_layers.append(result_layer) return transformed_layers