From fd2c18ee16a676265a7f7350fdc23da97ee27d19 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 26 Apr 2017 14:33:53 +1000 Subject: [PATCH] Refactor processing writer to use QgsFeatureSink, and to store temporary output layers in the provided processing context Should fix loss of intermediate memory layers when running a multi-step model --- .../core/processing/qgsprocessingcontext.sip | 8 +- .../processing/algs/qgis/AddTableField.py | 3 +- .../algs/qgis/AutoincrementalField.py | 3 +- .../plugins/processing/algs/qgis/Boundary.py | 5 +- .../processing/algs/qgis/BoundingBox.py | 5 +- .../plugins/processing/algs/qgis/Centroids.py | 5 +- .../processing/algs/qgis/CheckValidity.py | 15 +- python/plugins/processing/algs/qgis/Clip.py | 7 +- .../processing/algs/qgis/ConcaveHull.py | 4 +- .../processing/algs/qgis/ConvexHull.py | 3 +- .../plugins/processing/algs/qgis/Delaunay.py | 3 +- .../processing/algs/qgis/DeleteColumn.py | 3 +- .../algs/qgis/DeleteDuplicateGeometries.py | 3 +- .../processing/algs/qgis/DeleteHoles.py | 6 +- .../processing/algs/qgis/DensifyGeometries.py | 3 +- .../algs/qgis/DensifyGeometriesInterval.py | 3 +- .../processing/algs/qgis/Difference.py | 4 +- .../plugins/processing/algs/qgis/Dissolve.py | 5 +- .../processing/algs/qgis/DropGeometry.py | 6 +- .../algs/qgis/EliminateSelection.py | 3 +- .../algs/qgis/EquivalentNumField.py | 3 +- .../processing/algs/qgis/ExecuteSQL.py | 8 +- .../plugins/processing/algs/qgis/Explode.py | 3 +- .../algs/qgis/ExportGeometryInfo.py | 4 +- .../processing/algs/qgis/ExtendLines.py | 5 +- .../processing/algs/qgis/ExtentFromLayer.py | 3 +- .../algs/qgis/ExtractByAttribute.py | 3 +- .../algs/qgis/ExtractByExpression.py | 3 +- .../processing/algs/qgis/ExtractByLocation.py | 3 +- .../processing/algs/qgis/ExtractNodes.py | 3 +- .../algs/qgis/ExtractSpecificNodes.py | 5 +- .../processing/algs/qgis/FieldPyculator.py | 3 +- .../processing/algs/qgis/FieldsCalculator.py | 3 +- .../processing/algs/qgis/FieldsMapper.py | 4 +- .../processing/algs/qgis/FixGeometry.py | 5 +- .../algs/qgis/FixedDistanceBuffer.py | 3 +- .../algs/qgis/GeometryByExpression.py | 5 +- .../processing/algs/qgis/GeometryConvert.py | 3 +- .../plugins/processing/algs/qgis/GridLine.py | 3 +- .../processing/algs/qgis/GridPolygon.py | 3 +- .../plugins/processing/algs/qgis/Gridify.py | 4 +- .../processing/algs/qgis/HubDistanceLines.py | 4 +- .../processing/algs/qgis/HubDistancePoints.py | 4 +- .../plugins/processing/algs/qgis/HubLines.py | 4 +- .../processing/algs/qgis/Intersection.py | 3 +- .../processing/algs/qgis/JoinAttributes.py | 3 +- .../processing/algs/qgis/LinesIntersection.py | 4 +- .../processing/algs/qgis/LinesToPolygons.py | 5 +- .../processing/algs/qgis/MeanCoords.py | 4 +- python/plugins/processing/algs/qgis/Merge.py | 5 +- .../processing/algs/qgis/MergeLines.py | 5 +- .../algs/qgis/MultipartToSingleparts.py | 4 +- .../processing/algs/qgis/OffsetLine.py | 5 +- .../algs/qgis/OrientedMinimumBoundingBox.py | 3 +- .../processing/algs/qgis/Orthogonalize.py | 5 +- .../processing/algs/qgis/PointOnSurface.py | 5 +- .../algs/qgis/PointsAlongGeometry.py | 3 +- .../algs/qgis/PointsDisplacement.py | 3 +- .../processing/algs/qgis/PointsFromLines.py | 4 +- .../algs/qgis/PointsFromPolygons.py | 4 +- .../processing/algs/qgis/PointsInPolygon.py | 4 +- .../algs/qgis/PointsInPolygonUnique.py | 4 +- .../algs/qgis/PointsInPolygonWeighted.py | 4 +- .../algs/qgis/PointsLayerFromTable.py | 2 +- .../processing/algs/qgis/PointsToPaths.py | 4 +- .../algs/qgis/PoleOfInaccessibility.py | 5 +- .../processing/algs/qgis/PolygonCentroids.py | 5 +- .../processing/algs/qgis/Polygonize.py | 2 +- .../processing/algs/qgis/PolygonsToLines.py | 4 +- .../processing/algs/qgis/RandomExtract.py | 4 +- .../algs/qgis/RandomExtractWithinSubsets.py | 4 +- .../algs/qgis/RandomPointsAlongLines.py | 3 +- .../algs/qgis/RandomPointsExtent.py | 3 +- .../processing/algs/qgis/RandomPointsLayer.py | 3 +- .../algs/qgis/RandomPointsPolygonsFixed.py | 3 +- .../algs/qgis/RandomPointsPolygonsVariable.py | 3 +- .../algs/qgis/RectanglesOvalsDiamondsFixed.py | 5 +- .../qgis/RectanglesOvalsDiamondsVariable.py | 5 +- .../processing/algs/qgis/RegularPoints.py | 3 +- .../algs/qgis/RemoveNullGeometry.py | 5 +- .../processing/algs/qgis/ReprojectLayer.py | 4 +- .../algs/qgis/ReverseLineDirection.py | 5 +- .../algs/qgis/SaveSelectedFeatures.py | 3 +- .../algs/qgis/ServiceAreaFromLayer.py | 10 +- .../algs/qgis/ServiceAreaFromPoint.py | 10 +- .../algs/qgis/ShortestPathLayerToPoint.py | 5 +- .../algs/qgis/ShortestPathPointToLayer.py | 5 +- .../algs/qgis/ShortestPathPointToPoint.py | 5 +- .../algs/qgis/SimplifyGeometries.py | 4 +- .../algs/qgis/SinglePartsToMultiparts.py | 4 +- .../processing/algs/qgis/SingleSidedBuffer.py | 5 +- python/plugins/processing/algs/qgis/Smooth.py | 5 +- .../processing/algs/qgis/SnapGeometries.py | 4 +- .../processing/algs/qgis/SpatialJoin.py | 3 +- .../algs/qgis/SplitLinesWithLines.py | 4 +- .../processing/algs/qgis/SplitWithLines.py | 4 +- .../plugins/processing/algs/qgis/SumLines.py | 4 +- .../algs/qgis/SymmetricalDifference.py | 3 +- .../processing/algs/qgis/TextToFloat.py | 3 +- .../processing/algs/qgis/TopoColors.py | 5 +- .../plugins/processing/algs/qgis/Translate.py | 5 +- python/plugins/processing/algs/qgis/Union.py | 3 +- .../algs/qgis/VariableDistanceBuffer.py | 4 +- .../processing/algs/qgis/VectorGridLines.py | 3 +- .../algs/qgis/VectorGridPolygons.py | 3 +- .../processing/algs/qgis/VectorSplit.py | 2 +- .../processing/algs/qgis/VoronoiPolygons.py | 4 +- .../processing/algs/qgis/ZonalStatistics.py | 4 +- .../Number_of_unique_values_in_classes.py | 6 +- .../algs/qgis/ui/FieldsCalculatorDialog.py | 4 +- .../plugins/processing/core/GeoAlgorithm.py | 5 +- python/plugins/processing/core/Processing.py | 2 +- python/plugins/processing/core/outputs.py | 14 +- .../plugins/processing/gui/AlgorithmDialog.py | 10 +- .../processing/gui/AlgorithmDialogBase.py | 2 +- .../processing/gui/AlgorithmExecutor.py | 2 +- .../processing/gui/BatchAlgorithmDialog.py | 7 +- .../plugins/processing/gui/Postprocessing.py | 6 +- .../processing/gui/ProcessingToolbox.py | 6 +- python/plugins/processing/gui/menus.py | 6 +- .../tests/testdata/scripts/centroids.py | 5 +- python/plugins/processing/tools/vector.py | 232 +++++++++--------- src/core/processing/qgsprocessingcontext.h | 7 +- 123 files changed, 307 insertions(+), 458 deletions(-) diff --git a/python/core/processing/qgsprocessingcontext.sip b/python/core/processing/qgsprocessingcontext.sip index ea9b25ca7bb..77f723c5088 100644 --- a/python/core/processing/qgsprocessingcontext.sip +++ b/python/core/processing/qgsprocessingcontext.sip @@ -75,8 +75,12 @@ class QgsProcessingContext Sets the expression ``context``. %End - - + QgsProject &temporaryLayerStore(); +%Docstring + Returns a reference to the project used for storing temporary layers during + algorithm execution. + :rtype: QgsProject +%End QgsFeatureRequest::InvalidGeometryCheck invalidGeometryCheck() const; %Docstring diff --git a/python/plugins/processing/algs/qgis/AddTableField.py b/python/plugins/processing/algs/qgis/AddTableField.py index 5d70e4822c0..f676948cc3c 100644 --- a/python/plugins/processing/algs/qgis/AddTableField.py +++ b/python/plugins/processing/algs/qgis/AddTableField.py @@ -97,8 +97,7 @@ class AddTableField(GeoAlgorithm): fields = layer.fields() fields.append(QgsField(fieldName, self.TYPES[fieldType], '', fieldLength, fieldPrecision)) - writer = output.getVectorWriter(fields, layer.wkbType(), - layer.crs()) + writer = output.getVectorWriter(fields, layer.wkbType(), layer.crs(), context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/AutoincrementalField.py b/python/plugins/processing/algs/qgis/AutoincrementalField.py index e7c94d10367..98fc8c52bed 100644 --- a/python/plugins/processing/algs/qgis/AutoincrementalField.py +++ b/python/plugins/processing/algs/qgis/AutoincrementalField.py @@ -67,8 +67,7 @@ class AutoincrementalField(GeoAlgorithm): dataobjects.getLayerFromString(self.getParameterValue(self.INPUT)) fields = vlayer.fields() fields.append(QgsField('AUTO', QVariant.Int)) - writer = output.getVectorWriter(fields, vlayer.wkbType(), - vlayer.crs()) + writer = output.getVectorWriter(fields, vlayer.wkbType(), vlayer.crs(), context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(vlayer, context) total = 100.0 / QgsProcessingUtils.featureCount(vlayer, context) diff --git a/python/plugins/processing/algs/qgis/Boundary.py b/python/plugins/processing/algs/qgis/Boundary.py index e0295dfe899..46446d12ba7 100644 --- a/python/plugins/processing/algs/qgis/Boundary.py +++ b/python/plugins/processing/algs/qgis/Boundary.py @@ -78,10 +78,7 @@ class Boundary(GeoAlgorithm): output_wkb = QgsWkbTypes.addM(output_wkb) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - output_wkb, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), output_wkb, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/BoundingBox.py b/python/plugins/processing/algs/qgis/BoundingBox.py index 89b25149b32..715d0b3220b 100644 --- a/python/plugins/processing/algs/qgis/BoundingBox.py +++ b/python/plugins/processing/algs/qgis/BoundingBox.py @@ -67,10 +67,7 @@ class BoundingBox(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - QgsWkbTypes.Polygon, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/Centroids.py b/python/plugins/processing/algs/qgis/Centroids.py index bdf858b5f04..2850e24dc5c 100644 --- a/python/plugins/processing/algs/qgis/Centroids.py +++ b/python/plugins/processing/algs/qgis/Centroids.py @@ -69,10 +69,7 @@ class Centroids(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - QgsWkbTypes.Point, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), QgsWkbTypes.Point, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/CheckValidity.py b/python/plugins/processing/algs/qgis/CheckValidity.py index 734aad69247..56145369914 100644 --- a/python/plugins/processing/algs/qgis/CheckValidity.py +++ b/python/plugins/processing/algs/qgis/CheckValidity.py @@ -108,10 +108,7 @@ class CheckValidity(GeoAlgorithm): valid_output = self.getOutputFromName(self.VALID_OUTPUT) valid_fields = layer.fields() - valid_writer = valid_output.getVectorWriter( - valid_fields, - layer.wkbType(), - layer.crs()) + valid_writer = valid_output.getVectorWriter(valid_fields, layer.wkbType(), layer.crs(), context) valid_count = 0 invalid_output = self.getOutputFromName(self.INVALID_OUTPUT) @@ -119,10 +116,7 @@ class CheckValidity(GeoAlgorithm): QgsField(name='_errors', type=QVariant.String, len=255)] - invalid_writer = invalid_output.getVectorWriter( - invalid_fields, - layer.wkbType(), - layer.crs()) + invalid_writer = invalid_output.getVectorWriter(invalid_fields, layer.wkbType(), layer.crs(), context) invalid_count = 0 error_output = self.getOutputFromName(self.ERROR_OUTPUT) @@ -130,10 +124,7 @@ class CheckValidity(GeoAlgorithm): QgsField(name='message', type=QVariant.String, len=255)] - error_writer = error_output.getVectorWriter( - error_fields, - QgsWkbTypes.Point, - layer.crs()) + error_writer = error_output.getVectorWriter(error_fields, QgsWkbTypes.Point, layer.crs(), context) error_count = 0 features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/Clip.py b/python/plugins/processing/algs/qgis/Clip.py index 849998996fa..0b0ba37a8dd 100644 --- a/python/plugins/processing/algs/qgis/Clip.py +++ b/python/plugins/processing/algs/qgis/Clip.py @@ -75,10 +75,9 @@ class Clip(GeoAlgorithm): mask_layer = dataobjects.getLayerFromString( self.getParameterValue(Clip.OVERLAY)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - source_layer.fields(), - QgsWkbTypes.multiType(source_layer.wkbType()), - source_layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(source_layer.fields(), + QgsWkbTypes.multiType(source_layer.wkbType()), + source_layer.crs(), context) # first build up a list of clip geometries clip_geoms = [] diff --git a/python/plugins/processing/algs/qgis/ConcaveHull.py b/python/plugins/processing/algs/qgis/ConcaveHull.py index a220e6929f6..856eddff15a 100644 --- a/python/plugins/processing/algs/qgis/ConcaveHull.py +++ b/python/plugins/processing/algs/qgis/ConcaveHull.py @@ -133,8 +133,8 @@ class ConcaveHull(GeoAlgorithm): feedback.setProgressText(self.tr('Saving data...')) feat = QgsFeature() dissolved_layer.getFeatures(QgsFeatureRequest().setFilterFid(0)).nextFeature(feat) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, + layer.crs(), context) geom = feat.geometry() if no_multigeom and geom.isMultipart(): # Only singlepart geometries are allowed diff --git a/python/plugins/processing/algs/qgis/ConvexHull.py b/python/plugins/processing/algs/qgis/ConvexHull.py index 2df701cf998..502afdd1252 100644 --- a/python/plugins/processing/algs/qgis/ConvexHull.py +++ b/python/plugins/processing/algs/qgis/ConvexHull.py @@ -103,8 +103,7 @@ class ConvexHull(GeoAlgorithm): QgsField('perim', QVariant.Double, '', 20, 6) ] - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context) outFeat = QgsFeature() inGeom = QgsGeometry() diff --git a/python/plugins/processing/algs/qgis/Delaunay.py b/python/plugins/processing/algs/qgis/Delaunay.py index 074b6d49ae5..9c8a7bf292d 100644 --- a/python/plugins/processing/algs/qgis/Delaunay.py +++ b/python/plugins/processing/algs/qgis/Delaunay.py @@ -77,8 +77,7 @@ class Delaunay(GeoAlgorithm): QgsField('POINTB', QVariant.Double, '', 24, 15), QgsField('POINTC', QVariant.Double, '', 24, 15)] - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context) pts = [] ptDict = {} diff --git a/python/plugins/processing/algs/qgis/DeleteColumn.py b/python/plugins/processing/algs/qgis/DeleteColumn.py index ba26eeb371a..84d915bea72 100644 --- a/python/plugins/processing/algs/qgis/DeleteColumn.py +++ b/python/plugins/processing/algs/qgis/DeleteColumn.py @@ -83,8 +83,7 @@ class DeleteColumn(GeoAlgorithm): for index in field_indices: fields.remove(index) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/DeleteDuplicateGeometries.py b/python/plugins/processing/algs/qgis/DeleteDuplicateGeometries.py index 87965f9d259..3a7e2efb36f 100644 --- a/python/plugins/processing/algs/qgis/DeleteDuplicateGeometries.py +++ b/python/plugins/processing/algs/qgis/DeleteDuplicateGeometries.py @@ -65,8 +65,7 @@ class DeleteDuplicateGeometries(GeoAlgorithm): fields = layer.fields() - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/DeleteHoles.py b/python/plugins/processing/algs/qgis/DeleteHoles.py index d476dab98b3..bbdcb2d48f5 100644 --- a/python/plugins/processing/algs/qgis/DeleteHoles.py +++ b/python/plugins/processing/algs/qgis/DeleteHoles.py @@ -77,10 +77,8 @@ class DeleteHoles(GeoAlgorithm): if min_area == 0.0: min_area = -1.0 - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields(), - layer.wkbType(), - layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), + context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/DensifyGeometries.py b/python/plugins/processing/algs/qgis/DensifyGeometries.py index c208dd8e3e4..02514bedce7 100644 --- a/python/plugins/processing/algs/qgis/DensifyGeometries.py +++ b/python/plugins/processing/algs/qgis/DensifyGeometries.py @@ -85,8 +85,7 @@ class DensifyGeometries(GeoAlgorithm): isPolygon = layer.geometryType() == QgsWkbTypes.PolygonGeometry writer = self.getOutputFromName( - self.OUTPUT).getVectorWriter(layer.fields().toList(), - layer.wkbType(), layer.crs()) + self.OUTPUT).getVectorWriter(layer.fields().toList(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/DensifyGeometriesInterval.py b/python/plugins/processing/algs/qgis/DensifyGeometriesInterval.py index 67d7d1d6d0e..c784b816cfa 100644 --- a/python/plugins/processing/algs/qgis/DensifyGeometriesInterval.py +++ b/python/plugins/processing/algs/qgis/DensifyGeometriesInterval.py @@ -79,8 +79,7 @@ class DensifyGeometriesInterval(GeoAlgorithm): isPolygon = layer.geometryType() == QgsWkbTypes.PolygonGeometry writer = self.getOutputFromName( - self.OUTPUT).getVectorWriter(layer.fields().toList(), - layer.wkbType(), layer.crs()) + self.OUTPUT).getVectorWriter(layer.fields().toList(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/Difference.py b/python/plugins/processing/algs/qgis/Difference.py index d3b5016ae52..49d42c7c5e9 100644 --- a/python/plugins/processing/algs/qgis/Difference.py +++ b/python/plugins/processing/algs/qgis/Difference.py @@ -77,9 +77,7 @@ class Difference(GeoAlgorithm): geomType = QgsWkbTypes.multiType(layerA.wkbType()) writer = self.getOutputFromName( - Difference.OUTPUT).getVectorWriter(layerA.fields(), - geomType, - layerA.crs()) + Difference.OUTPUT).getVectorWriter(layerA.fields(), geomType, layerA.crs(), context) outFeat = QgsFeature() index = vector.spatialindex(layerB) diff --git a/python/plugins/processing/algs/qgis/Dissolve.py b/python/plugins/processing/algs/qgis/Dissolve.py index 62515c4a5eb..c338d409118 100644 --- a/python/plugins/processing/algs/qgis/Dissolve.py +++ b/python/plugins/processing/algs/qgis/Dissolve.py @@ -82,10 +82,7 @@ class Dissolve(GeoAlgorithm): self.getParameterValue(Dissolve.INPUT)) writer = self.getOutputFromName( - Dissolve.OUTPUT).getVectorWriter( - vlayerA.fields().toList(), - vlayerA.wkbType(), - vlayerA.crs()) + Dissolve.OUTPUT).getVectorWriter(vlayerA.fields().toList(), vlayerA.wkbType(), vlayerA.crs(), context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(vlayerA, context) diff --git a/python/plugins/processing/algs/qgis/DropGeometry.py b/python/plugins/processing/algs/qgis/DropGeometry.py index 64c3924b7ab..ac447822607 100644 --- a/python/plugins/processing/algs/qgis/DropGeometry.py +++ b/python/plugins/processing/algs/qgis/DropGeometry.py @@ -70,10 +70,8 @@ class DropGeometry(GeoAlgorithm): layer = dataobjects.getLayerFromString( self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_TABLE).getVectorWriter( - layer.fields(), - QgsWkbTypes.NoGeometry, - QgsCoordinateReferenceSystem()) + self.OUTPUT_TABLE).getVectorWriter(layer.fields(), QgsWkbTypes.NoGeometry, QgsCoordinateReferenceSystem(), + context) request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry) features = QgsProcessingUtils.getFeatures(layer, context, request) diff --git a/python/plugins/processing/algs/qgis/EliminateSelection.py b/python/plugins/processing/algs/qgis/EliminateSelection.py index b4ca979a385..6cdfc1ca0cf 100644 --- a/python/plugins/processing/algs/qgis/EliminateSelection.py +++ b/python/plugins/processing/algs/qgis/EliminateSelection.py @@ -92,8 +92,7 @@ class EliminateSelection(GeoAlgorithm): featToEliminate = [] selFeatIds = inLayer.selectedFeatureIds() output = self.getOutputFromName(self.OUTPUT) - writer = output.getVectorWriter(inLayer.fields(), - inLayer.wkbType(), inLayer.crs()) + writer = output.getVectorWriter(inLayer.fields(), inLayer.wkbType(), inLayer.crs(), context) for aFeat in inLayer.getFeatures(): if aFeat.id() in selFeatIds: diff --git a/python/plugins/processing/algs/qgis/EquivalentNumField.py b/python/plugins/processing/algs/qgis/EquivalentNumField.py index 68d24b70f09..0aa320e5c74 100644 --- a/python/plugins/processing/algs/qgis/EquivalentNumField.py +++ b/python/plugins/processing/algs/qgis/EquivalentNumField.py @@ -73,8 +73,7 @@ class EquivalentNumField(GeoAlgorithm): fieldindex = vlayer.fields().lookupField(fieldname) fields = vlayer.fields() fields.append(QgsField('NUM_FIELD', QVariant.Int)) - writer = output.getVectorWriter(fields, vlayer.wkbType(), - vlayer.crs()) + writer = output.getVectorWriter(fields, vlayer.wkbType(), vlayer.crs(), context) outFeat = QgsFeature() classes = {} diff --git a/python/plugins/processing/algs/qgis/ExecuteSQL.py b/python/plugins/processing/algs/qgis/ExecuteSQL.py index ecaf3a58038..95141d49f9c 100644 --- a/python/plugins/processing/algs/qgis/ExecuteSQL.py +++ b/python/plugins/processing/algs/qgis/ExecuteSQL.py @@ -146,11 +146,9 @@ class ExecuteSQL(GeoAlgorithm): if not vLayer.isValid(): raise GeoAlgorithmExecutionException(vLayer.dataProvider().error().message()) - writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter( - vLayer.fields().toList(), - # Create a point layer (without any points) if 'no geometry' is chosen - vLayer.wkbType() if geometry_type != 1 else 1, - vLayer.crs()) + writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(vLayer.fields().toList(), + vLayer.wkbType() if geometry_type != 1 else 1, + vLayer.crs(), context) features = QgsProcessingUtils.getFeatures(vLayer, context) total = 100.0 / QgsProcessingUtils.featureCount(vLayer, context) diff --git a/python/plugins/processing/algs/qgis/Explode.py b/python/plugins/processing/algs/qgis/Explode.py index b4fedba43a4..9dd7ae48860 100644 --- a/python/plugins/processing/algs/qgis/Explode.py +++ b/python/plugins/processing/algs/qgis/Explode.py @@ -68,8 +68,7 @@ class Explode(GeoAlgorithm): self.getParameterValue(self.INPUT)) output = self.getOutputFromName(self.OUTPUT) fields = vlayer.fields() - writer = output.getVectorWriter(fields, QgsWkbTypes.LineString, - vlayer.crs()) + writer = output.getVectorWriter(fields, QgsWkbTypes.LineString, vlayer.crs(), context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(vlayer, context) total = 100.0 / QgsProcessingUtils.featureCount(vlayer, context) diff --git a/python/plugins/processing/algs/qgis/ExportGeometryInfo.py b/python/plugins/processing/algs/qgis/ExportGeometryInfo.py index 2dc89cc96c3..2f5652fb960 100644 --- a/python/plugins/processing/algs/qgis/ExportGeometryInfo.py +++ b/python/plugins/processing/algs/qgis/ExportGeometryInfo.py @@ -107,8 +107,8 @@ class ExportGeometryInfo(GeoAlgorithm): zName = vector.createUniqueFieldName('mvalue', fields) fields.append(QgsField(zName, QVariant.Double)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields.toList(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), layer.wkbType(), layer.crs(), + context) ellips = None crs = None diff --git a/python/plugins/processing/algs/qgis/ExtendLines.py b/python/plugins/processing/algs/qgis/ExtendLines.py index d528e4a765d..25236329b00 100644 --- a/python/plugins/processing/algs/qgis/ExtendLines.py +++ b/python/plugins/processing/algs/qgis/ExtendLines.py @@ -71,10 +71,7 @@ class ExtendLines(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) start_distance = self.getParameterValue(self.START_DISTANCE) end_distance = self.getParameterValue(self.END_DISTANCE) diff --git a/python/plugins/processing/algs/qgis/ExtentFromLayer.py b/python/plugins/processing/algs/qgis/ExtentFromLayer.py index 9de5f900465..d9fa9ec02f5 100644 --- a/python/plugins/processing/algs/qgis/ExtentFromLayer.py +++ b/python/plugins/processing/algs/qgis/ExtentFromLayer.py @@ -89,8 +89,7 @@ class ExtentFromLayer(GeoAlgorithm): QgsField('WIDTH', QVariant.Double), ] - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context) if byFeature: self.featureExtent(layer, context, writer, feedback) diff --git a/python/plugins/processing/algs/qgis/ExtractByAttribute.py b/python/plugins/processing/algs/qgis/ExtractByAttribute.py index 03b9d0ef12a..5b1d5309a4a 100755 --- a/python/plugins/processing/algs/qgis/ExtractByAttribute.py +++ b/python/plugins/processing/algs/qgis/ExtractByAttribute.py @@ -111,8 +111,7 @@ class ExtractByAttribute(GeoAlgorithm): value = self.getParameterValue(self.VALUE) fields = layer.fields() - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, layer.wkbType(), layer.crs(), context) idx = layer.fields().lookupField(fieldName) fieldType = fields[idx].type() diff --git a/python/plugins/processing/algs/qgis/ExtractByExpression.py b/python/plugins/processing/algs/qgis/ExtractByExpression.py index bbaf9f55d5e..a4ea0599c77 100644 --- a/python/plugins/processing/algs/qgis/ExtractByExpression.py +++ b/python/plugins/processing/algs/qgis/ExtractByExpression.py @@ -70,7 +70,8 @@ class ExtractByExpression(GeoAlgorithm): def processAlgorithm(self, context, feedback): layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT)) expression_string = self.getParameterValue(self.EXPRESSION) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), + context) expression = QgsExpression(expression_string) if not expression.hasParserError(): diff --git a/python/plugins/processing/algs/qgis/ExtractByLocation.py b/python/plugins/processing/algs/qgis/ExtractByLocation.py index 3fc742dc8fb..0030c797a7d 100644 --- a/python/plugins/processing/algs/qgis/ExtractByLocation.py +++ b/python/plugins/processing/algs/qgis/ExtractByLocation.py @@ -97,8 +97,7 @@ class ExtractByLocation(GeoAlgorithm): index = vector.spatialindex(layer) output = self.getOutputFromName(self.OUTPUT) - writer = output.getVectorWriter(layer.fields(), - layer.wkbType(), layer.crs()) + writer = output.getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) if 'disjoint' in predicates: disjoinSet = [] diff --git a/python/plugins/processing/algs/qgis/ExtractNodes.py b/python/plugins/processing/algs/qgis/ExtractNodes.py index 41c799ffd3b..8cd38ee1154 100644 --- a/python/plugins/processing/algs/qgis/ExtractNodes.py +++ b/python/plugins/processing/algs/qgis/ExtractNodes.py @@ -75,8 +75,7 @@ class ExtractNodes(GeoAlgorithm): fields.append(QgsField('distance', QVariant.Double)) fields.append(QgsField('angle', QVariant.Double)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/ExtractSpecificNodes.py b/python/plugins/processing/algs/qgis/ExtractSpecificNodes.py index 4c8451a10bd..324ba59121d 100644 --- a/python/plugins/processing/algs/qgis/ExtractSpecificNodes.py +++ b/python/plugins/processing/algs/qgis/ExtractSpecificNodes.py @@ -80,10 +80,7 @@ class ExtractSpecificNodes(GeoAlgorithm): fields.append(QgsField('angle', QVariant.Double)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - fields, - QgsWkbTypes.Point, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) node_indices_string = self.getParameterValue(self.NODES) indices = [] diff --git a/python/plugins/processing/algs/qgis/FieldPyculator.py b/python/plugins/processing/algs/qgis/FieldPyculator.py index 0f3cded509b..a792365e0ee 100644 --- a/python/plugins/processing/algs/qgis/FieldPyculator.py +++ b/python/plugins/processing/algs/qgis/FieldPyculator.py @@ -107,8 +107,7 @@ class FieldsPyculator(GeoAlgorithm): fields = layer.fields() fields.append(QgsField(fieldName, self.TYPES[fieldType], '', fieldLength, fieldPrecision)) - writer = output.getVectorWriter(fields, layer.wkbType(), - layer.crs()) + writer = output.getVectorWriter(fields, layer.wkbType(), layer.crs(), context) outFeat = QgsFeature() new_ns = {} diff --git a/python/plugins/processing/algs/qgis/FieldsCalculator.py b/python/plugins/processing/algs/qgis/FieldsCalculator.py index 1ec1bc2f6c7..91605783d38 100644 --- a/python/plugins/processing/algs/qgis/FieldsCalculator.py +++ b/python/plugins/processing/algs/qgis/FieldsCalculator.py @@ -113,8 +113,7 @@ class FieldsCalculator(GeoAlgorithm): if newField: fields.append(QgsField(fieldName, fieldType, '', width, precision)) - writer = output.getVectorWriter(fields, layer.wkbType(), - layer.crs()) + writer = output.getVectorWriter(fields, layer.wkbType(), layer.crs(), context) exp = QgsExpression(formula) diff --git a/python/plugins/processing/algs/qgis/FieldsMapper.py b/python/plugins/processing/algs/qgis/FieldsMapper.py index 6b86d402fa9..78092c003b4 100644 --- a/python/plugins/processing/algs/qgis/FieldsMapper.py +++ b/python/plugins/processing/algs/qgis/FieldsMapper.py @@ -144,9 +144,7 @@ class FieldsMapper(GeoAlgorithm): str(expression.parserErrorString()))) expressions.append(expression) - writer = output.getVectorWriter(fields, - layer.wkbType(), - layer.crs()) + writer = output.getVectorWriter(fields, layer.wkbType(), layer.crs(), context) # Create output vector layer with new attributes error_exp = None diff --git a/python/plugins/processing/algs/qgis/FixGeometry.py b/python/plugins/processing/algs/qgis/FixGeometry.py index 50c0f02bf17..3fa862c183d 100644 --- a/python/plugins/processing/algs/qgis/FixGeometry.py +++ b/python/plugins/processing/algs/qgis/FixGeometry.py @@ -73,10 +73,7 @@ class FixGeometry(GeoAlgorithm): self.getParameterValue(self.INPUT)) writer = self.getOutputFromName( - self.OUTPUT).getVectorWriter( - layer.fields(), - QgsWkbTypes.multiType(layer.wkbType()), - layer.crs()) + self.OUTPUT).getVectorWriter(layer.fields(), QgsWkbTypes.multiType(layer.wkbType()), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) if QgsProcessingUtils.featureCount(layer, context) == 0: diff --git a/python/plugins/processing/algs/qgis/FixedDistanceBuffer.py b/python/plugins/processing/algs/qgis/FixedDistanceBuffer.py index e0d162d109f..36d822261cc 100644 --- a/python/plugins/processing/algs/qgis/FixedDistanceBuffer.py +++ b/python/plugins/processing/algs/qgis/FixedDistanceBuffer.py @@ -105,8 +105,7 @@ class FixedDistanceBuffer(GeoAlgorithm): miter_limit = self.getParameterValue(self.MITRE_LIMIT) writer = self.getOutputFromName( - self.OUTPUT).getVectorWriter(layer.fields().toList(), - QgsWkbTypes.Polygon, layer.crs()) + self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs(), context) buff.buffering(feedback, context, writer, distance, None, False, layer, dissolve, segments, end_cap_style, join_style, miter_limit) diff --git a/python/plugins/processing/algs/qgis/GeometryByExpression.py b/python/plugins/processing/algs/qgis/GeometryByExpression.py index 2873b6dc183..be7a056e318 100644 --- a/python/plugins/processing/algs/qgis/GeometryByExpression.py +++ b/python/plugins/processing/algs/qgis/GeometryByExpression.py @@ -103,10 +103,7 @@ class GeometryByExpression(GeoAlgorithm): wkb_type = QgsWkbTypes.addM(wkb_type) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - wkb_type, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), wkb_type, layer.crs(), context) expression = QgsExpression(self.getParameterValue(self.EXPRESSION)) if expression.hasParserError(): diff --git a/python/plugins/processing/algs/qgis/GeometryConvert.py b/python/plugins/processing/algs/qgis/GeometryConvert.py index f9539cd56a8..0032711ca80 100644 --- a/python/plugins/processing/algs/qgis/GeometryConvert.py +++ b/python/plugins/processing/algs/qgis/GeometryConvert.py @@ -93,8 +93,7 @@ class GeometryConvert(GeoAlgorithm): else: newType = QgsWkbTypes.Point - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields(), newType, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), newType, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/GridLine.py b/python/plugins/processing/algs/qgis/GridLine.py index 04b8b5c5a7c..c620c61e63b 100644 --- a/python/plugins/processing/algs/qgis/GridLine.py +++ b/python/plugins/processing/algs/qgis/GridLine.py @@ -126,8 +126,7 @@ class GridLine(GeoAlgorithm): QgsField('coord', QVariant.Double, '', 24, 15) ] - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - QgsWkbTypes.LineString, crs) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.LineString, crs, context) if hOverlay > 0: hSpace = [hSpacing - hOverlay, hOverlay] diff --git a/python/plugins/processing/algs/qgis/GridPolygon.py b/python/plugins/processing/algs/qgis/GridPolygon.py index 10425a6b798..4b5148da65c 100644 --- a/python/plugins/processing/algs/qgis/GridPolygon.py +++ b/python/plugins/processing/algs/qgis/GridPolygon.py @@ -130,8 +130,7 @@ class GridPolygon(GeoAlgorithm): QgsField('id', QVariant.Int, '', 10, 0) ] - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - QgsWkbTypes.Polygon, crs) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, crs, context) if idx == 0: self._rectangleGrid( diff --git a/python/plugins/processing/algs/qgis/Gridify.py b/python/plugins/processing/algs/qgis/Gridify.py index 40ef1ca1565..45a5cc13dc3 100644 --- a/python/plugins/processing/algs/qgis/Gridify.py +++ b/python/plugins/processing/algs/qgis/Gridify.py @@ -81,8 +81,8 @@ class Gridify(GeoAlgorithm): raise GeoAlgorithmExecutionException( self.tr('Invalid grid spacing: {0}/{1}').format(hSpacing, vSpacing)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), + context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/HubDistanceLines.py b/python/plugins/processing/algs/qgis/HubDistanceLines.py index cf39ac82975..35355ad9ca4 100644 --- a/python/plugins/processing/algs/qgis/HubDistanceLines.py +++ b/python/plugins/processing/algs/qgis/HubDistanceLines.py @@ -112,8 +112,8 @@ class HubDistanceLines(GeoAlgorithm): fields.append(QgsField('HubName', QVariant.String)) fields.append(QgsField('HubDist', QVariant.Double)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.LineString, layerPoints.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.LineString, layerPoints.crs(), + context) index = vector.spatialindex(layerHubs) diff --git a/python/plugins/processing/algs/qgis/HubDistancePoints.py b/python/plugins/processing/algs/qgis/HubDistancePoints.py index 8ce06987ff4..de089eb722f 100644 --- a/python/plugins/processing/algs/qgis/HubDistancePoints.py +++ b/python/plugins/processing/algs/qgis/HubDistancePoints.py @@ -112,8 +112,8 @@ class HubDistancePoints(GeoAlgorithm): fields.append(QgsField('HubName', QVariant.String)) fields.append(QgsField('HubDist', QVariant.Double)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layerPoints.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layerPoints.crs(), + context) index = vector.spatialindex(layerHubs) diff --git a/python/plugins/processing/algs/qgis/HubLines.py b/python/plugins/processing/algs/qgis/HubLines.py index 2a07be504fa..49cb58dcdf2 100644 --- a/python/plugins/processing/algs/qgis/HubLines.py +++ b/python/plugins/processing/algs/qgis/HubLines.py @@ -88,8 +88,8 @@ class HubLines(GeoAlgorithm): raise GeoAlgorithmExecutionException( self.tr('Same layer given for both hubs and spokes')) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layerSpoke.fields(), QgsWkbTypes.LineString, layerSpoke.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layerSpoke.fields(), QgsWkbTypes.LineString, + layerSpoke.crs(), context) spokes = QgsProcessingUtils.getFeatures(layerSpoke, context) hubs = QgsProcessingUtils.getFeatures(layerHub, context) diff --git a/python/plugins/processing/algs/qgis/Intersection.py b/python/plugins/processing/algs/qgis/Intersection.py index 16935238c01..718580df943 100644 --- a/python/plugins/processing/algs/qgis/Intersection.py +++ b/python/plugins/processing/algs/qgis/Intersection.py @@ -86,8 +86,7 @@ class Intersection(GeoAlgorithm): geomType = QgsWkbTypes.multiType(vlayerA.wkbType()) fields = vector.combineVectorFields(vlayerA, vlayerB) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - geomType, vlayerA.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, geomType, vlayerA.crs(), context) outFeat = QgsFeature() index = vector.spatialindex(vlayerB) selectionA = QgsProcessingUtils.getFeatures(vlayerA, context) diff --git a/python/plugins/processing/algs/qgis/JoinAttributes.py b/python/plugins/processing/algs/qgis/JoinAttributes.py index 72c3481ed1d..0bc6e97df07 100644 --- a/python/plugins/processing/algs/qgis/JoinAttributes.py +++ b/python/plugins/processing/algs/qgis/JoinAttributes.py @@ -91,8 +91,7 @@ class JoinAttributes(GeoAlgorithm): joinField2Index = layer2.fields().lookupField(field2) outFields = vector.combineVectorFields(layer, layer2) - writer = output.getVectorWriter(outFields, layer.wkbType(), - layer.crs()) + writer = output.getVectorWriter(outFields, layer.wkbType(), layer.crs(), context) # Cache attributes of Layer 2 cache = {} diff --git a/python/plugins/processing/algs/qgis/LinesIntersection.py b/python/plugins/processing/algs/qgis/LinesIntersection.py index ccb952f6649..21522870d1a 100644 --- a/python/plugins/processing/algs/qgis/LinesIntersection.py +++ b/python/plugins/processing/algs/qgis/LinesIntersection.py @@ -105,8 +105,8 @@ class LinesIntersection(GeoAlgorithm): fieldListB = vector.testForUniqueness(fieldListA, fieldListB) fieldListA.extend(fieldListB) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldListA, - QgsWkbTypes.Point, layerA.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldListA, QgsWkbTypes.Point, layerA.crs(), + context) spatialIndex = vector.spatialindex(layerB) diff --git a/python/plugins/processing/algs/qgis/LinesToPolygons.py b/python/plugins/processing/algs/qgis/LinesToPolygons.py index 4e00b9f6d89..7dd358b21ed 100644 --- a/python/plugins/processing/algs/qgis/LinesToPolygons.py +++ b/python/plugins/processing/algs/qgis/LinesToPolygons.py @@ -68,9 +68,8 @@ class LinesToPolygons(GeoAlgorithm): def processAlgorithm(self, context, feedback): layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs() - ) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, + layer.crs(), context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/MeanCoords.py b/python/plugins/processing/algs/qgis/MeanCoords.py index 4c1cb438424..7beb79aa79d 100644 --- a/python/plugins/processing/algs/qgis/MeanCoords.py +++ b/python/plugins/processing/algs/qgis/MeanCoords.py @@ -97,9 +97,7 @@ class MeanCoords(GeoAlgorithm): QgsField('MEAN_Y', QVariant.Double, '', 24, 15), QgsField('UID', QVariant.String, '', 255)] - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fieldList, QgsWkbTypes.Point, layer.crs() - ) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QgsWkbTypes.Point, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/Merge.py b/python/plugins/processing/algs/qgis/Merge.py index 0f77b364bc2..ea42c77757d 100644 --- a/python/plugins/processing/algs/qgis/Merge.py +++ b/python/plugins/processing/algs/qgis/Merge.py @@ -94,9 +94,8 @@ class Merge(GeoAlgorithm): fields.append(sfield) total = 100.0 / totalFeatureCount - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields.toList(), layers[0].wkbType(), - layers[0].crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), layers[0].wkbType(), + layers[0].crs(), context) featureCount = 0 for layer in layers: diff --git a/python/plugins/processing/algs/qgis/MergeLines.py b/python/plugins/processing/algs/qgis/MergeLines.py index b33e7dc7e6f..b44af989a0f 100644 --- a/python/plugins/processing/algs/qgis/MergeLines.py +++ b/python/plugins/processing/algs/qgis/MergeLines.py @@ -70,10 +70,7 @@ class MergeLines(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/MultipartToSingleparts.py b/python/plugins/processing/algs/qgis/MultipartToSingleparts.py index 19087f2695e..099b417459c 100644 --- a/python/plugins/processing/algs/qgis/MultipartToSingleparts.py +++ b/python/plugins/processing/algs/qgis/MultipartToSingleparts.py @@ -64,8 +64,8 @@ class MultipartToSingleparts(GeoAlgorithm): layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT)) geomType = QgsWkbTypes.singleType(layer.wkbType()) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), geomType, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), geomType, layer.crs(), + context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/OffsetLine.py b/python/plugins/processing/algs/qgis/OffsetLine.py index 0bc5a92d02c..155d182bde7 100644 --- a/python/plugins/processing/algs/qgis/OffsetLine.py +++ b/python/plugins/processing/algs/qgis/OffsetLine.py @@ -88,10 +88,7 @@ class OffsetLine(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - QgsWkbTypes.LineString, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), QgsWkbTypes.LineString, layer.crs(), context) distance = self.getParameterValue(self.DISTANCE) segments = int(self.getParameterValue(self.SEGMENTS)) diff --git a/python/plugins/processing/algs/qgis/OrientedMinimumBoundingBox.py b/python/plugins/processing/algs/qgis/OrientedMinimumBoundingBox.py index 02ac667e036..d99833416ca 100644 --- a/python/plugins/processing/algs/qgis/OrientedMinimumBoundingBox.py +++ b/python/plugins/processing/algs/qgis/OrientedMinimumBoundingBox.py @@ -90,8 +90,7 @@ class OrientedMinimumBoundingBox(GeoAlgorithm): fields.append(QgsField('width', QVariant.Double)) fields.append(QgsField('height', QVariant.Double)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context) if byFeature: self.featureOmbb(layer, context, writer, feedback) diff --git a/python/plugins/processing/algs/qgis/Orthogonalize.py b/python/plugins/processing/algs/qgis/Orthogonalize.py index 307c0c2bc92..5dd98ca4367 100644 --- a/python/plugins/processing/algs/qgis/Orthogonalize.py +++ b/python/plugins/processing/algs/qgis/Orthogonalize.py @@ -82,10 +82,7 @@ class Orthogonalize(GeoAlgorithm): max_iterations = self.getParameterValue(self.MAX_ITERATIONS) angle_tolerance = self.getParameterValue(self.ANGLE_TOLERANCE) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/PointOnSurface.py b/python/plugins/processing/algs/qgis/PointOnSurface.py index 90116fb2570..213bbc4fd8c 100644 --- a/python/plugins/processing/algs/qgis/PointOnSurface.py +++ b/python/plugins/processing/algs/qgis/PointOnSurface.py @@ -67,10 +67,7 @@ class PointOnSurface(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - QgsWkbTypes.Point, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Point, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/PointsAlongGeometry.py b/python/plugins/processing/algs/qgis/PointsAlongGeometry.py index 50f1a2f3fdb..fa83399ad46 100644 --- a/python/plugins/processing/algs/qgis/PointsAlongGeometry.py +++ b/python/plugins/processing/algs/qgis/PointsAlongGeometry.py @@ -87,8 +87,7 @@ class PointsAlongGeometry(GeoAlgorithm): fields.append(QgsField('distance', QVariant.Double)) fields.append(QgsField('angle', QVariant.Double)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/PointsDisplacement.py b/python/plugins/processing/algs/qgis/PointsDisplacement.py index c75a0385dc3..c57771ec9ac 100644 --- a/python/plugins/processing/algs/qgis/PointsDisplacement.py +++ b/python/plugins/processing/algs/qgis/PointsDisplacement.py @@ -80,8 +80,7 @@ class PointsDisplacement(GeoAlgorithm): layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT_LAYER)) - writer = output.getVectorWriter(layer.fields(), - layer.wkbType(), layer.crs()) + writer = output.getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/PointsFromLines.py b/python/plugins/processing/algs/qgis/PointsFromLines.py index 5048fd31b91..15dc4a10c39 100644 --- a/python/plugins/processing/algs/qgis/PointsFromLines.py +++ b/python/plugins/processing/algs/qgis/PointsFromLines.py @@ -87,8 +87,8 @@ class PointsFromLines(GeoAlgorithm): fields.append(QgsField('line_id', QVariant.Int, '', 10, 0)) fields.append(QgsField('point_id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter( - fields.toList(), QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(fields.toList(), QgsWkbTypes.Point, + layer.crs(), context) outFeature = QgsFeature() outFeature.setFields(fields) diff --git a/python/plugins/processing/algs/qgis/PointsFromPolygons.py b/python/plugins/processing/algs/qgis/PointsFromPolygons.py index 5ccf7d719fe..a13e3808a0a 100644 --- a/python/plugins/processing/algs/qgis/PointsFromPolygons.py +++ b/python/plugins/processing/algs/qgis/PointsFromPolygons.py @@ -87,8 +87,8 @@ class PointsFromPolygons(GeoAlgorithm): fields.append(QgsField('poly_id', QVariant.Int, '', 10, 0)) fields.append(QgsField('point_id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter( - fields.toList(), QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(fields.toList(), QgsWkbTypes.Point, + layer.crs(), context) outFeature = QgsFeature() outFeature.setFields(fields) diff --git a/python/plugins/processing/algs/qgis/PointsInPolygon.py b/python/plugins/processing/algs/qgis/PointsInPolygon.py index c9c259ad39e..3f91a132794 100644 --- a/python/plugins/processing/algs/qgis/PointsInPolygon.py +++ b/python/plugins/processing/algs/qgis/PointsInPolygon.py @@ -80,8 +80,8 @@ class PointsInPolygon(GeoAlgorithm): (idxCount, fieldList) = vector.findOrCreateField(polyLayer, polyLayer.fields(), fieldName) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields.toList(), polyLayer.wkbType(), polyLayer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), polyLayer.wkbType(), + polyLayer.crs(), context) spatialIndex = vector.spatialindex(pointLayer) diff --git a/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py b/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py index c7bbf8617fa..be28b5ce12d 100644 --- a/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py +++ b/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py @@ -87,8 +87,8 @@ class PointsInPolygonUnique(GeoAlgorithm): (idxCount, fieldList) = vector.findOrCreateField(polyLayer, polyLayer.fields(), fieldName) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields.toList(), polyLayer.wkbType(), polyLayer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), polyLayer.wkbType(), + polyLayer.crs(), context) spatialIndex = vector.spatialindex(pointLayer) diff --git a/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py b/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py index 75fbb5ade11..8b4638100d4 100644 --- a/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py +++ b/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py @@ -93,8 +93,8 @@ class PointsInPolygonWeighted(GeoAlgorithm): (idxCount, fieldList) = vector.findOrCreateField(polyLayer, polyLayer.fields(), fieldName) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields.toList(), polyLayer.wkbType(), polyLayer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), polyLayer.wkbType(), + polyLayer.crs(), context) spatialIndex = vector.spatialindex(pointLayer) diff --git a/python/plugins/processing/algs/qgis/PointsLayerFromTable.py b/python/plugins/processing/algs/qgis/PointsLayerFromTable.py index 1208af841be..bc64cf58713 100644 --- a/python/plugins/processing/algs/qgis/PointsLayerFromTable.py +++ b/python/plugins/processing/algs/qgis/PointsLayerFromTable.py @@ -107,7 +107,7 @@ class PointsLayerFromTable(GeoAlgorithm): target_crs = QgsCoordinateReferenceSystem() target_crs.createFromUserInput(crsId) - writer = output.getVectorWriter(fields, wkb_type, target_crs) + writer = output.getVectorWriter(fields, wkb_type, target_crs, context) features = QgsProcessingUtils.getFeatures(vlayer, context) total = 100.0 / QgsProcessingUtils.featureCount(vlayer, context) diff --git a/python/plugins/processing/algs/qgis/PointsToPaths.py b/python/plugins/processing/algs/qgis/PointsToPaths.py index 90cafad46de..4988ca9ade7 100644 --- a/python/plugins/processing/algs/qgis/PointsToPaths.py +++ b/python/plugins/processing/algs/qgis/PointsToPaths.py @@ -101,8 +101,8 @@ class PointsToPaths(GeoAlgorithm): fields.append(QgsField('group', QVariant.String, '', 254, 0)) fields.append(QgsField('begin', QVariant.String, '', 254, 0)) fields.append(QgsField('end', QVariant.String, '', 254, 0)) - writer = self.getOutputFromName(self.OUTPUT_LINES).getVectorWriter( - fields, QgsWkbTypes.LineString, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT_LINES).getVectorWriter(fields, QgsWkbTypes.LineString, layer.crs(), + context) points = dict() features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/PoleOfInaccessibility.py b/python/plugins/processing/algs/qgis/PoleOfInaccessibility.py index ef59c059b14..555cdfab84d 100644 --- a/python/plugins/processing/algs/qgis/PoleOfInaccessibility.py +++ b/python/plugins/processing/algs/qgis/PoleOfInaccessibility.py @@ -79,10 +79,7 @@ class PoleOfInaccessibility(GeoAlgorithm): fields.append(QgsField('dist_pole', QVariant.Double)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - fields, - QgsWkbTypes.Point, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/PolygonCentroids.py b/python/plugins/processing/algs/qgis/PolygonCentroids.py index d9daaf592e5..fec602de180 100644 --- a/python/plugins/processing/algs/qgis/PolygonCentroids.py +++ b/python/plugins/processing/algs/qgis/PolygonCentroids.py @@ -76,10 +76,7 @@ class PolygonCentroids(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - QgsWkbTypes.Point, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), QgsWkbTypes.Point, layer.crs(), context) outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/Polygonize.py b/python/plugins/processing/algs/qgis/Polygonize.py index 8cb835fc1cd..44ccde4027e 100644 --- a/python/plugins/processing/algs/qgis/Polygonize.py +++ b/python/plugins/processing/algs/qgis/Polygonize.py @@ -110,7 +110,7 @@ class Polygonize(GeoAlgorithm): feedback.setProgress(50) feedback.pushInfo('Saving polygons...') - writer = output.getVectorWriter(fields, QgsWkbTypes.Polygon, vlayer.crs()) + writer = output.getVectorWriter(fields, QgsWkbTypes.Polygon, vlayer.crs(), context) total = 50.0 / polygons.geometry().numGeometries() for i in range(polygons.geometry().numGeometries()): outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/PolygonsToLines.py b/python/plugins/processing/algs/qgis/PolygonsToLines.py index 721b6ba2b6d..bc457c51e0f 100644 --- a/python/plugins/processing/algs/qgis/PolygonsToLines.py +++ b/python/plugins/processing/algs/qgis/PolygonsToLines.py @@ -68,8 +68,8 @@ class PolygonsToLines(GeoAlgorithm): def processAlgorithm(self, context, feedback): layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), QgsWkbTypes.LineString, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.LineString, + layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/RandomExtract.py b/python/plugins/processing/algs/qgis/RandomExtract.py index 118ed5ef81f..719b78be7ca 100644 --- a/python/plugins/processing/algs/qgis/RandomExtract.py +++ b/python/plugins/processing/algs/qgis/RandomExtract.py @@ -97,8 +97,8 @@ class RandomExtract(GeoAlgorithm): selran = random.sample(list(range(featureCount)), value) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), layer.wkbType(), + layer.crs(), context) total = 100.0 / featureCount for i, feat in enumerate(features): diff --git a/python/plugins/processing/algs/qgis/RandomExtractWithinSubsets.py b/python/plugins/processing/algs/qgis/RandomExtractWithinSubsets.py index 6654149d427..e07e9f4944e 100644 --- a/python/plugins/processing/algs/qgis/RandomExtractWithinSubsets.py +++ b/python/plugins/processing/algs/qgis/RandomExtractWithinSubsets.py @@ -104,8 +104,8 @@ class RandomExtractWithinSubsets(GeoAlgorithm): "correct value and try again.")) value = value / 100.0 - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), layer.wkbType(), + layer.crs(), context) selran = [] total = 100.0 / (featureCount * len(unique)) diff --git a/python/plugins/processing/algs/qgis/RandomPointsAlongLines.py b/python/plugins/processing/algs/qgis/RandomPointsAlongLines.py index 65ef2ff34f9..4bb6a62bfbe 100644 --- a/python/plugins/processing/algs/qgis/RandomPointsAlongLines.py +++ b/python/plugins/processing/algs/qgis/RandomPointsAlongLines.py @@ -88,8 +88,7 @@ class RandomPointsAlongLines(GeoAlgorithm): fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) nPoints = 0 nIterations = 0 diff --git a/python/plugins/processing/algs/qgis/RandomPointsExtent.py b/python/plugins/processing/algs/qgis/RandomPointsExtent.py index 44a4a02e75c..42b5ebd6e85 100644 --- a/python/plugins/processing/algs/qgis/RandomPointsExtent.py +++ b/python/plugins/processing/algs/qgis/RandomPointsExtent.py @@ -97,8 +97,7 @@ class RandomPointsExtent(GeoAlgorithm): fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, crs) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, crs, context) nPoints = 0 nIterations = 0 diff --git a/python/plugins/processing/algs/qgis/RandomPointsLayer.py b/python/plugins/processing/algs/qgis/RandomPointsLayer.py index 813c4098411..c7292e37c04 100644 --- a/python/plugins/processing/algs/qgis/RandomPointsLayer.py +++ b/python/plugins/processing/algs/qgis/RandomPointsLayer.py @@ -83,8 +83,7 @@ class RandomPointsLayer(GeoAlgorithm): fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) nPoints = 0 nIterations = 0 diff --git a/python/plugins/processing/algs/qgis/RandomPointsPolygonsFixed.py b/python/plugins/processing/algs/qgis/RandomPointsPolygonsFixed.py index c2222d56698..d02c54a4231 100644 --- a/python/plugins/processing/algs/qgis/RandomPointsPolygonsFixed.py +++ b/python/plugins/processing/algs/qgis/RandomPointsPolygonsFixed.py @@ -89,8 +89,7 @@ class RandomPointsPolygonsFixed(GeoAlgorithm): fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) da = QgsDistanceArea() diff --git a/python/plugins/processing/algs/qgis/RandomPointsPolygonsVariable.py b/python/plugins/processing/algs/qgis/RandomPointsPolygonsVariable.py index 34598070ade..3b5025a8755 100644 --- a/python/plugins/processing/algs/qgis/RandomPointsPolygonsVariable.py +++ b/python/plugins/processing/algs/qgis/RandomPointsPolygonsVariable.py @@ -90,8 +90,7 @@ class RandomPointsPolygonsVariable(GeoAlgorithm): fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) da = QgsDistanceArea() diff --git a/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsFixed.py b/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsFixed.py index fd0e111a4ac..f203427d36c 100644 --- a/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsFixed.py +++ b/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsFixed.py @@ -102,10 +102,7 @@ class RectanglesOvalsDiamondsFixed(GeoAlgorithm): segments = self.getParameterValue(self.SEGMENTS) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - QgsWkbTypes.Polygon, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsVariable.py b/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsVariable.py index 2d073381726..c2cd3000749 100644 --- a/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsVariable.py +++ b/python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsVariable.py @@ -111,10 +111,7 @@ class RectanglesOvalsDiamondsVariable(GeoAlgorithm): segments = self.getParameterValue(self.SEGMENTS) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - QgsWkbTypes.Polygon, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/RegularPoints.py b/python/plugins/processing/algs/qgis/RegularPoints.py index df6a66fd1eb..5522aa5d6b0 100644 --- a/python/plugins/processing/algs/qgis/RegularPoints.py +++ b/python/plugins/processing/algs/qgis/RegularPoints.py @@ -101,8 +101,7 @@ class RegularPoints(GeoAlgorithm): fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Point, crs) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, crs, context) if randomize: seed() diff --git a/python/plugins/processing/algs/qgis/RemoveNullGeometry.py b/python/plugins/processing/algs/qgis/RemoveNullGeometry.py index ec36381a64e..a1be481103e 100644 --- a/python/plugins/processing/algs/qgis/RemoveNullGeometry.py +++ b/python/plugins/processing/algs/qgis/RemoveNullGeometry.py @@ -65,10 +65,7 @@ class RemoveNullGeometry(GeoAlgorithm): layer = dataobjects.getLayerFromString( self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/ReprojectLayer.py b/python/plugins/processing/algs/qgis/ReprojectLayer.py index bef0444a807..b8451f2c61a 100644 --- a/python/plugins/processing/algs/qgis/ReprojectLayer.py +++ b/python/plugins/processing/algs/qgis/ReprojectLayer.py @@ -73,8 +73,8 @@ class ReprojectLayer(GeoAlgorithm): targetCrs = QgsCoordinateReferenceSystem() targetCrs.createFromUserInput(crsId) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), layer.wkbType(), targetCrs) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), layer.wkbType(), + targetCrs, context) layerCrs = layer.crs() crsTransform = QgsCoordinateTransform(layerCrs, targetCrs) diff --git a/python/plugins/processing/algs/qgis/ReverseLineDirection.py b/python/plugins/processing/algs/qgis/ReverseLineDirection.py index 809b907b285..713b47e4dfc 100644 --- a/python/plugins/processing/algs/qgis/ReverseLineDirection.py +++ b/python/plugins/processing/algs/qgis/ReverseLineDirection.py @@ -66,10 +66,7 @@ class ReverseLineDirection(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), layer.wkbType(), layer.crs(), context) outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py b/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py index 3482d4d3a58..4e4c4469827 100644 --- a/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py +++ b/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py @@ -65,8 +65,7 @@ class SaveSelectedFeatures(GeoAlgorithm): vectorLayer = dataobjects.getLayerFromString(inputFilename) - writer = output.getVectorWriter(vectorLayer.fields(), - vectorLayer.wkbType(), vectorLayer.crs()) + writer = output.getVectorWriter(vectorLayer.fields(), vectorLayer.wkbType(), vectorLayer.crs(), context) features = vectorLayer.selectedFeaturesIterator() total = 100.0 / int(vectorLayer.selectedFeatureCount()) diff --git a/python/plugins/processing/algs/qgis/ServiceAreaFromLayer.py b/python/plugins/processing/algs/qgis/ServiceAreaFromLayer.py index bf7efc94281..44bd0301021 100644 --- a/python/plugins/processing/algs/qgis/ServiceAreaFromLayer.py +++ b/python/plugins/processing/algs/qgis/ServiceAreaFromLayer.py @@ -176,16 +176,10 @@ class ServiceAreaFromLayer(GeoAlgorithm): feat.setFields(fields) writerPoints = self.getOutputFromName( - self.OUTPUT_POINTS).getVectorWriter( - fields, - QgsWkbTypes.MultiPoint, - layer.crs()) + self.OUTPUT_POINTS).getVectorWriter(fields, QgsWkbTypes.MultiPoint, layer.crs(), context) writerPolygons = self.getOutputFromName( - self.OUTPUT_POLYGON).getVectorWriter( - fields, - QgsWkbTypes.Polygon, - layer.crs()) + self.OUTPUT_POLYGON).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context) directionField = -1 if directionFieldName is not None: diff --git a/python/plugins/processing/algs/qgis/ServiceAreaFromPoint.py b/python/plugins/processing/algs/qgis/ServiceAreaFromPoint.py index 4ea3d5c6b18..762f64c63b2 100644 --- a/python/plugins/processing/algs/qgis/ServiceAreaFromPoint.py +++ b/python/plugins/processing/algs/qgis/ServiceAreaFromPoint.py @@ -231,10 +231,7 @@ class ServiceAreaFromPoint(GeoAlgorithm): geomLower = QgsGeometry.fromMultiPoint(lowerBoundary) writer = self.getOutputFromName( - self.OUTPUT_POINTS).getVectorWriter( - fields, - QgsWkbTypes.MultiPoint, - layer.crs()) + self.OUTPUT_POINTS).getVectorWriter(fields, QgsWkbTypes.MultiPoint, layer.crs(), context) feat.setGeometry(geomUpper) feat['type'] = 'upper' @@ -254,10 +251,7 @@ class ServiceAreaFromPoint(GeoAlgorithm): geomLower = QgsGeometry.fromMultiPoint(lowerBoundary) writer = self.getOutputFromName( - self.OUTPUT_POLYGON).getVectorWriter( - fields, - QgsWkbTypes.Polygon, - layer.crs()) + self.OUTPUT_POLYGON).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context) geom = geomUpper.convexHull() feat.setGeometry(geom) diff --git a/python/plugins/processing/algs/qgis/ShortestPathLayerToPoint.py b/python/plugins/processing/algs/qgis/ShortestPathLayerToPoint.py index 9072d143ea9..88a3fcd0747 100644 --- a/python/plugins/processing/algs/qgis/ShortestPathLayerToPoint.py +++ b/python/plugins/processing/algs/qgis/ShortestPathLayerToPoint.py @@ -182,10 +182,7 @@ class ShortestPathLayerToPoint(GeoAlgorithm): feat.setFields(fields) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - fields.toList(), - QgsWkbTypes.LineString, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(fields.toList(), QgsWkbTypes.LineString, layer.crs(), context) tmp = endPoint.split(',') endPoint = QgsPoint(float(tmp[0]), float(tmp[1])) diff --git a/python/plugins/processing/algs/qgis/ShortestPathPointToLayer.py b/python/plugins/processing/algs/qgis/ShortestPathPointToLayer.py index 6d75136aa96..f3c23c97961 100644 --- a/python/plugins/processing/algs/qgis/ShortestPathPointToLayer.py +++ b/python/plugins/processing/algs/qgis/ShortestPathPointToLayer.py @@ -175,10 +175,7 @@ class ShortestPathPointToLayer(GeoAlgorithm): feat.setFields(fields) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - fields.toList(), - QgsWkbTypes.LineString, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(fields.toList(), QgsWkbTypes.LineString, layer.crs(), context) tmp = startPoint.split(',') startPoint = QgsPoint(float(tmp[0]), float(tmp[1])) diff --git a/python/plugins/processing/algs/qgis/ShortestPathPointToPoint.py b/python/plugins/processing/algs/qgis/ShortestPathPointToPoint.py index 3eae6bcfad4..f58bcff6172 100644 --- a/python/plugins/processing/algs/qgis/ShortestPathPointToPoint.py +++ b/python/plugins/processing/algs/qgis/ShortestPathPointToPoint.py @@ -174,10 +174,7 @@ class ShortestPathPointToPoint(GeoAlgorithm): fields.append(QgsField('cost', QVariant.Double, '', 20, 7)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - fields.toList(), - QgsWkbTypes.LineString, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(fields.toList(), QgsWkbTypes.LineString, layer.crs(), context) tmp = startPoint.split(',') startPoint = QgsPoint(float(tmp[0]), float(tmp[1])) diff --git a/python/plugins/processing/algs/qgis/SimplifyGeometries.py b/python/plugins/processing/algs/qgis/SimplifyGeometries.py index 4e49f643c1b..9a3020d3031 100644 --- a/python/plugins/processing/algs/qgis/SimplifyGeometries.py +++ b/python/plugins/processing/algs/qgis/SimplifyGeometries.py @@ -86,8 +86,8 @@ class SimplifyGeometries(GeoAlgorithm): pointsBefore = 0 pointsAfter = 0 - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), layer.wkbType(), + layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/SinglePartsToMultiparts.py b/python/plugins/processing/algs/qgis/SinglePartsToMultiparts.py index 59fbcf6fc04..6a84fd2df9a 100644 --- a/python/plugins/processing/algs/qgis/SinglePartsToMultiparts.py +++ b/python/plugins/processing/algs/qgis/SinglePartsToMultiparts.py @@ -72,8 +72,8 @@ class SinglePartsToMultiparts(GeoAlgorithm): geomType = QgsWkbTypes.multiType(layer.wkbType()) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), geomType, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), geomType, layer.crs(), + context) outFeat = QgsFeature() inGeom = QgsGeometry() diff --git a/python/plugins/processing/algs/qgis/SingleSidedBuffer.py b/python/plugins/processing/algs/qgis/SingleSidedBuffer.py index 4b7b8b0f6f3..31f11bd5190 100644 --- a/python/plugins/processing/algs/qgis/SingleSidedBuffer.py +++ b/python/plugins/processing/algs/qgis/SingleSidedBuffer.py @@ -98,10 +98,7 @@ class SingleSidedBuffer(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - QgsWkbTypes.Polygon, - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs(), context) distance = self.getParameterValue(self.DISTANCE) segments = int(self.getParameterValue(self.SEGMENTS)) diff --git a/python/plugins/processing/algs/qgis/Smooth.py b/python/plugins/processing/algs/qgis/Smooth.py index e4729c42d34..3a1cca8963a 100644 --- a/python/plugins/processing/algs/qgis/Smooth.py +++ b/python/plugins/processing/algs/qgis/Smooth.py @@ -76,10 +76,7 @@ class Smooth(GeoAlgorithm): max_angle = self.getParameterValue(self.MAX_ANGLE) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/algs/qgis/SnapGeometries.py b/python/plugins/processing/algs/qgis/SnapGeometries.py index 143882fdd61..41b39863cd5 100644 --- a/python/plugins/processing/algs/qgis/SnapGeometries.py +++ b/python/plugins/processing/algs/qgis/SnapGeometries.py @@ -82,8 +82,8 @@ class SnapGeometriesToLayer(GeoAlgorithm): tolerance = self.getParameterValue(self.TOLERANCE) mode = self.getParameterValue(self.BEHAVIOR) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), + context) features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/SpatialJoin.py b/python/plugins/processing/algs/qgis/SpatialJoin.py index 094db17051a..f530a0300bb 100644 --- a/python/plugins/processing/algs/qgis/SpatialJoin.py +++ b/python/plugins/processing/algs/qgis/SpatialJoin.py @@ -150,8 +150,7 @@ class SpatialJoin(GeoAlgorithm): for f in list(targetFields.values()): fields.append(f) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, target.wkbType(), target.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, target.wkbType(), target.crs(), context) outFeat = QgsFeature() inFeatB = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/SplitLinesWithLines.py b/python/plugins/processing/algs/qgis/SplitLinesWithLines.py index 6e228cdd271..804cc717cc3 100644 --- a/python/plugins/processing/algs/qgis/SplitLinesWithLines.py +++ b/python/plugins/processing/algs/qgis/SplitLinesWithLines.py @@ -82,8 +82,8 @@ class SplitLinesWithLines(GeoAlgorithm): sameLayer = self.getParameterValue(self.INPUT_A) == self.getParameterValue(self.INPUT_B) fieldList = layerA.fields() - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, - QgsWkbTypes.LineString, layerA.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QgsWkbTypes.LineString, layerA.crs(), + context) spatialIndex = vector.spatialindex(layerB) diff --git a/python/plugins/processing/algs/qgis/SplitWithLines.py b/python/plugins/processing/algs/qgis/SplitWithLines.py index 9663b15c052..f14e6e50846 100644 --- a/python/plugins/processing/algs/qgis/SplitWithLines.py +++ b/python/plugins/processing/algs/qgis/SplitWithLines.py @@ -78,8 +78,8 @@ class SplitWithLines(GeoAlgorithm): sameLayer = self.getParameterValue(self.INPUT_A) == self.getParameterValue(self.INPUT_B) fieldList = layerA.fields() - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, - QgsWkbTypes.multiType(layerA.wkbType()), layerA.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QgsWkbTypes.multiType(layerA.wkbType()), + layerA.crs(), context) spatialIndex = QgsSpatialIndex() splitGeoms = {} diff --git a/python/plugins/processing/algs/qgis/SumLines.py b/python/plugins/processing/algs/qgis/SumLines.py index 89ba31cad57..ad5cbd0adb6 100644 --- a/python/plugins/processing/algs/qgis/SumLines.py +++ b/python/plugins/processing/algs/qgis/SumLines.py @@ -83,8 +83,8 @@ class SumLines(GeoAlgorithm): (idxCount, fieldList) = vector.findOrCreateField(polyLayer, fieldList, countFieldName) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fieldList.toList(), polyLayer.wkbType(), polyLayer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList.toList(), polyLayer.wkbType(), + polyLayer.crs(), context) spatialIndex = vector.spatialindex(lineLayer) diff --git a/python/plugins/processing/algs/qgis/SymmetricalDifference.py b/python/plugins/processing/algs/qgis/SymmetricalDifference.py index cbaf8d8bf1e..9dd144468ec 100644 --- a/python/plugins/processing/algs/qgis/SymmetricalDifference.py +++ b/python/plugins/processing/algs/qgis/SymmetricalDifference.py @@ -78,8 +78,7 @@ class SymmetricalDifference(GeoAlgorithm): geomType = QgsWkbTypes.multiType(layerA.wkbType()) fields = vector.combineVectorFields(layerA, layerB) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, geomType, layerA.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, geomType, layerA.crs(), context) featB = QgsFeature() outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/TextToFloat.py b/python/plugins/processing/algs/qgis/TextToFloat.py index 3a5fa50fd3d..4877fd71271 100644 --- a/python/plugins/processing/algs/qgis/TextToFloat.py +++ b/python/plugins/processing/algs/qgis/TextToFloat.py @@ -72,8 +72,7 @@ class TextToFloat(GeoAlgorithm): fields = layer.fields() fields[idx] = QgsField(fieldName, QVariant.Double, '', 24, 15) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, - layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) diff --git a/python/plugins/processing/algs/qgis/TopoColors.py b/python/plugins/processing/algs/qgis/TopoColors.py index 95e817fe079..6f63ae9d13e 100755 --- a/python/plugins/processing/algs/qgis/TopoColors.py +++ b/python/plugins/processing/algs/qgis/TopoColors.py @@ -104,10 +104,7 @@ class TopoColor(GeoAlgorithm): fields.append(QgsField('color_id', QVariant.Int)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - fields, - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(fields, layer.wkbType(), layer.crs(), context) features = {f.id(): f for f in QgsProcessingUtils.getFeatures(layer, context)} diff --git a/python/plugins/processing/algs/qgis/Translate.py b/python/plugins/processing/algs/qgis/Translate.py index fc516cce57c..36e74666568 100644 --- a/python/plugins/processing/algs/qgis/Translate.py +++ b/python/plugins/processing/algs/qgis/Translate.py @@ -75,10 +75,7 @@ class Translate(GeoAlgorithm): self.getParameterValue(self.INPUT_LAYER)) writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter( - layer.fields().toList(), - layer.wkbType(), - layer.crs()) + self.OUTPUT_LAYER).getVectorWriter(layer.fields().toList(), layer.wkbType(), layer.crs(), context) delta_x = self.getParameterValue(self.DELTA_X) delta_y = self.getParameterValue(self.DELTA_Y) diff --git a/python/plugins/processing/algs/qgis/Union.py b/python/plugins/processing/algs/qgis/Union.py index b953025e39d..aeffbd9c229 100644 --- a/python/plugins/processing/algs/qgis/Union.py +++ b/python/plugins/processing/algs/qgis/Union.py @@ -84,8 +84,7 @@ class Union(GeoAlgorithm): geomType = vlayerA.wkbType() fields = vector.combineVectorFields(vlayerA, vlayerB) - writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter(fields, - geomType, vlayerA.crs()) + writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter(fields, geomType, vlayerA.crs(), context) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/VariableDistanceBuffer.py b/python/plugins/processing/algs/qgis/VariableDistanceBuffer.py index f36697e7c23..7cc85552f94 100644 --- a/python/plugins/processing/algs/qgis/VariableDistanceBuffer.py +++ b/python/plugins/processing/algs/qgis/VariableDistanceBuffer.py @@ -81,7 +81,7 @@ class VariableDistanceBuffer(GeoAlgorithm): field = self.getParameterValue(self.FIELD) segments = int(self.getParameterValue(self.SEGMENTS)) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, + layer.crs(), context) buff.buffering(feedback, context, writer, 0, field, True, layer, dissolve, segments) diff --git a/python/plugins/processing/algs/qgis/VectorGridLines.py b/python/plugins/processing/algs/qgis/VectorGridLines.py index 89ef9fcd1c2..a0b06e0ff13 100644 --- a/python/plugins/processing/algs/qgis/VectorGridLines.py +++ b/python/plugins/processing/algs/qgis/VectorGridLines.py @@ -98,8 +98,7 @@ class VectorGridLines(GeoAlgorithm): fields.append(QgsField('coord', QVariant.Double, '', 24, 15)) fieldCount = 2 - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.LineString, mapCRS) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.LineString, mapCRS, context) feat = QgsFeature() feat.initAttributes(fieldCount) diff --git a/python/plugins/processing/algs/qgis/VectorGridPolygons.py b/python/plugins/processing/algs/qgis/VectorGridPolygons.py index c6d04a0090b..80fb66e7426 100644 --- a/python/plugins/processing/algs/qgis/VectorGridPolygons.py +++ b/python/plugins/processing/algs/qgis/VectorGridPolygons.py @@ -101,8 +101,7 @@ class VectorGridPolygons(GeoAlgorithm): fields.append(QgsField('ymin', QVariant.Double, '', 24, 15)) fields.append(QgsField('ymax', QVariant.Double, '', 24, 15)) fieldCount = 5 - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - fields, QgsWkbTypes.Polygon, mapCRS) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, mapCRS, context) feat = QgsFeature() feat.initAttributes(fieldCount) diff --git a/python/plugins/processing/algs/qgis/VectorSplit.py b/python/plugins/processing/algs/qgis/VectorSplit.py index b6c227740fb..65981b8501f 100644 --- a/python/plugins/processing/algs/qgis/VectorSplit.py +++ b/python/plugins/processing/algs/qgis/VectorSplit.py @@ -87,7 +87,7 @@ class VectorSplit(GeoAlgorithm): for current, i in enumerate(uniqueValues): fName = u'{0}_{1}.shp'.format(baseName, str(i).strip()) - writer = vector.VectorWriter(fName, None, fields, geomType, crs) + writer, dest, layer = vector.createVectorWriter(fName, None, fields, geomType, crs, context) for f in QgsProcessingUtils.getFeatures(layer, context): if f[fieldName] == i: writer.addFeature(f) diff --git a/python/plugins/processing/algs/qgis/VoronoiPolygons.py b/python/plugins/processing/algs/qgis/VoronoiPolygons.py index b9a8fed7342..a08cc4f36c9 100644 --- a/python/plugins/processing/algs/qgis/VoronoiPolygons.py +++ b/python/plugins/processing/algs/qgis/VoronoiPolygons.py @@ -75,8 +75,8 @@ class VoronoiPolygons(GeoAlgorithm): buf = self.getParameterValue(self.BUFFER) - writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( - layer.fields().toList(), QgsWkbTypes.Polygon, layer.crs()) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon, + layer.crs(), context) outFeat = QgsFeature() extent = layer.extent() diff --git a/python/plugins/processing/algs/qgis/ZonalStatistics.py b/python/plugins/processing/algs/qgis/ZonalStatistics.py index 5a64c2faa5b..6bc315de462 100644 --- a/python/plugins/processing/algs/qgis/ZonalStatistics.py +++ b/python/plugins/processing/algs/qgis/ZonalStatistics.py @@ -176,8 +176,8 @@ class ZonalStatistics(GeoAlgorithm): (idxMode, fields) = vector.findOrCreateField(layer, fields, columnPrefix + 'mode', 21, 6) - writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter( - fields.toList(), layer.wkbType(), layer.crs()) + writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(fields.toList(), layer.wkbType(), + layer.crs(), context) outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py b/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py index 3a07bd5a430..bd6205521ce 100644 --- a/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py +++ b/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py @@ -6,14 +6,14 @@ from qgis.PyQt.QtCore import QVariant from qgis.core import QgsFeature, QgsField, QgsProcessingUtils -from processing.tools.vector import VectorWriter +from processing.tools.vector import createVectorWriter from processing.tools import dataobjects layer = dataobjects.getLayerFromString(input) fields = layer.fields() fields.append(QgsField('UNIQ_COUNT', QVariant.Int)) -writer = VectorWriter(N_unique_values, None, fields, layer.wkbType(), - layer.crs()) +writer, writer_dest, writer_layer = createVectorWriter(N_unique_values, None, fields, layer.wkbType(), layer.crs(), + context) class_field_index = layer.fields().lookupField(class_field) value_field_index = layer.fields().lookupField(value_field) diff --git a/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py b/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py index faadbe3c139..3b4227d60a0 100644 --- a/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py +++ b/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py @@ -226,9 +226,11 @@ class FieldsCalculatorDialog(BASE, WIDGET): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) ProcessingLog.addToLog(self.alg.getAsCommand()) - self.executed = execute(self.alg, None, self.feedback) + context = dataobjects.createContext() + self.executed = execute(self.alg, context, self.feedback) if self.executed: handleAlgorithmResults(self.alg, + context, self.feedback, not keepOpen) if not keepOpen: diff --git a/python/plugins/processing/core/GeoAlgorithm.py b/python/plugins/processing/core/GeoAlgorithm.py index 2f15652fd6d..3707a486852 100755 --- a/python/plugins/processing/core/GeoAlgorithm.py +++ b/python/plugins/processing/core/GeoAlgorithm.py @@ -268,10 +268,7 @@ class GeoAlgorithm(QgsProcessingAlgorithm): # For the case of memory layer, if the # getCompatible method has been called continue - writer = out.getVectorWriter( - layer.fields(), - layer.wkbType(), layer.crs() - ) + writer = out.getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) features = QgsProcessingUtils.getFeatures(layer, context) for feature in features: writer.addFeature(feature) diff --git a/python/plugins/processing/core/Processing.py b/python/plugins/processing/core/Processing.py index 05160fdc568..5ff43e84c37 100755 --- a/python/plugins/processing/core/Processing.py +++ b/python/plugins/processing/core/Processing.py @@ -232,7 +232,7 @@ class Processing(object): ret = execute(alg, context, feedback) if ret: if onFinish is not None: - onFinish(alg, feedback) + onFinish(alg, context, feedback) else: QgsMessageLog.logMessage(Processing.tr("There were errors executing the algorithm."), Processing.tr("Processing")) diff --git a/python/plugins/processing/core/outputs.py b/python/plugins/processing/core/outputs.py index a925f69ba7a..8f7fe0ee045 100644 --- a/python/plugins/processing/core/outputs.py +++ b/python/plugins/processing/core/outputs.py @@ -35,7 +35,7 @@ from qgis.PyQt.QtCore import QCoreApplication from processing.core.ProcessingConfig import ProcessingConfig from processing.tools.system import isWindows, getTempFilenameInTempFolder, getTempDirInTempFolder -from processing.tools.vector import VectorWriter, TableWriter +from processing.tools.vector import createVectorWriter, TableWriter, NOGEOMETRY_EXTENSIONS from processing.tools import dataobjects from qgis.core import (QgsExpressionContext, @@ -324,7 +324,7 @@ class OutputVector(Output): def getSupportedOutputVectorLayerExtensions(self): exts = QgsVectorFileWriter.supportedFormatExtensions() if not self.hasGeometry(): - exts = ['dbf'] + [ext for ext in exts if ext in VectorWriter.nogeometry_extensions] + exts = ['dbf'] + [ext for ext in exts if ext in NOGEOMETRY_EXTENSIONS] return exts def getFileFilter(self, alg): @@ -360,7 +360,7 @@ class OutputVector(Output): self.compatible = getTempFilenameInTempFolder(self.name + '.' + ext) return self.compatible - def getVectorWriter(self, fields, geomType, crs, options=None): + def getVectorWriter(self, fields, geomType, crs, context, options=None): """Returns a suitable writer to which features can be added as a result of the algorithm. Use this to transparently handle output values instead of creating your own method. @@ -377,16 +377,16 @@ class OutputVector(Output): @param crs the crs of the layer to create @return writer instance of the vector writer class + :param context: """ if self.encoding is None: settings = QgsSettings() self.encoding = settings.value('/Processing/encoding', 'System', str) - w = VectorWriter(self.value, self.encoding, fields, geomType, - crs, options) - self.layer = w.layer - self.value = w.destination + w, w_dest, w_layer = createVectorWriter(self.value, self.encoding, fields, geomType, crs, context, options) + self.layer = w_layer + self.value = w_dest return w def dataType(self): diff --git a/python/plugins/processing/gui/AlgorithmDialog.py b/python/plugins/processing/gui/AlgorithmDialog.py index 0b7c0286d93..726a1fdde4f 100644 --- a/python/plugins/processing/gui/AlgorithmDialog.py +++ b/python/plugins/processing/gui/AlgorithmDialog.py @@ -202,7 +202,7 @@ class AlgorithmDialog(AlgorithmDialogBase): if self.iterateParam: if executeIterating(self.alg, self.iterateParam, context, self.feedback): - self.finish() + self.finish(context) else: QApplication.restoreOverrideCursor() self.resetGUI() @@ -210,8 +210,8 @@ class AlgorithmDialog(AlgorithmDialogBase): command = self.alg.getAsCommand() if command: ProcessingLog.addToLog(command) - if execute(self.alg, None, self.feedback): - self.finish() + if execute(self.alg, context, self.feedback): + self.finish(context) else: QApplication.restoreOverrideCursor() self.resetGUI() @@ -228,11 +228,11 @@ class AlgorithmDialog(AlgorithmDialogBase): self.bar.pushMessage("", self.tr("Wrong or missing parameter value: {0}").format(e.parameter.description), level=QgsMessageBar.WARNING, duration=5) - def finish(self): + def finish(self, context): keepOpen = ProcessingConfig.getSetting(ProcessingConfig.KEEP_DIALOG_OPEN) if self.iterateParam is None: - if not handleAlgorithmResults(self.alg, self.feedback, not keepOpen): + if not handleAlgorithmResults(self.alg, context, self.feedback, not keepOpen): self.resetGUI() return diff --git a/python/plugins/processing/gui/AlgorithmDialogBase.py b/python/plugins/processing/gui/AlgorithmDialogBase.py index 34f148d1162..6c0d28b0fd1 100644 --- a/python/plugins/processing/gui/AlgorithmDialogBase.py +++ b/python/plugins/processing/gui/AlgorithmDialogBase.py @@ -222,7 +222,7 @@ class AlgorithmDialogBase(BASE, WIDGET): def accept(self): pass - def finish(self): + def finish(self, context): pass class InvalidParameterValue(Exception): diff --git a/python/plugins/processing/gui/AlgorithmExecutor.py b/python/plugins/processing/gui/AlgorithmExecutor.py index 80768cb88ea..0be452dc72b 100644 --- a/python/plugins/processing/gui/AlgorithmExecutor.py +++ b/python/plugins/processing/gui/AlgorithmExecutor.py @@ -99,7 +99,7 @@ def executeIterating(alg, paramToIter, context, feedback): feedback.setProgressText(tr('Executing iteration {0}/{1}...').format(i, len(filelist))) feedback.setProgress(i * 100 / len(filelist)) if execute(alg, None, feedback): - handleAlgorithmResults(alg, None, False) + handleAlgorithmResults(alg, context, None, False) else: return False diff --git a/python/plugins/processing/gui/BatchAlgorithmDialog.py b/python/plugins/processing/gui/BatchAlgorithmDialog.py index 89d36ddb77d..7ecb17d3eae 100644 --- a/python/plugins/processing/gui/BatchAlgorithmDialog.py +++ b/python/plugins/processing/gui/BatchAlgorithmDialog.py @@ -44,6 +44,7 @@ from processing.core.outputs import OutputString from processing.core.outputs import OutputHTML from processing.tools.system import getTempFilename +from processing.tools import dataobjects import codecs @@ -118,12 +119,14 @@ class BatchAlgorithmDialog(AlgorithmDialogBase): except: pass + context = dataobjects.createContext() + for count, alg in enumerate(self.algs): self.setText(self.tr('\nProcessing algorithm {0}/{1}...').format(count + 1, len(self.algs))) self.setInfo(self.tr('Algorithm {0} starting...').format(alg.displayName())) - if execute(alg, None, self.feedback) and not self.canceled: + if execute(alg, context, self.feedback) and not self.canceled: if self.load[count]: - handleAlgorithmResults(alg, self.feedback, False) + handleAlgorithmResults(alg, context, self.feedback, False) self.setInfo(self.tr('Algorithm {0} correctly executed...').format(alg.displayName())) else: QApplication.restoreOverrideCursor() diff --git a/python/plugins/processing/gui/Postprocessing.py b/python/plugins/processing/gui/Postprocessing.py index c9b1348656f..826c6ff3784 100644 --- a/python/plugins/processing/gui/Postprocessing.py +++ b/python/plugins/processing/gui/Postprocessing.py @@ -49,7 +49,7 @@ from processing.core.outputs import OutputHTML from processing.tools import dataobjects -def handleAlgorithmResults(alg, feedback=None, showResults=True): +def handleAlgorithmResults(alg, context, feedback=None, showResults=True): wrongLayers = [] if feedback is None: feedback = QgsProcessingFeedback() @@ -63,7 +63,9 @@ def handleAlgorithmResults(alg, feedback=None, showResults=True): try: if hasattr(out, "layer") and out.layer is not None: out.layer.setName(out.description) - QgsProject.instance().addMapLayers([out.layer]) + QgsProject.instance().addMapLayer(context.temporaryLayerStore().takeMapLayer(out.layer)) + # temporary hack to work around mutable outputs + out.layer = None else: if ProcessingConfig.getSetting( ProcessingConfig.USE_FILENAME_AS_LAYER_NAME): diff --git a/python/plugins/processing/gui/ProcessingToolbox.py b/python/plugins/processing/gui/ProcessingToolbox.py index 6b1a87fc1ca..c1cc3c12aee 100644 --- a/python/plugins/processing/gui/ProcessingToolbox.py +++ b/python/plugins/processing/gui/ProcessingToolbox.py @@ -49,6 +49,7 @@ from processing.gui.MessageBarProgress import MessageBarProgress from processing.gui.AlgorithmExecutor import execute from processing.gui.ProviderActions import (ProviderActions, ProviderContextMenuActions) +from processing.tools import dataobjects pluginPath = os.path.split(os.path.dirname(__file__))[0] WIDGET, BASE = uic.loadUiType( @@ -249,6 +250,7 @@ class ProcessingToolbox(BASE, WIDGET): def executeAlgorithm(self): item = self.algorithmTree.currentItem() if isinstance(item, TreeAlgorithmItem): + context = dataobjects.createContext() alg = QgsApplication.processingRegistry().algorithmById(item.alg.id()) message = alg.checkBeforeOpeningParametersDialog() if message: @@ -281,8 +283,8 @@ class ProcessingToolbox(BASE, WIDGET): self.addRecentAlgorithms(True) else: feedback = MessageBarProgress() - execute(alg, None, feedback) - handleAlgorithmResults(alg, feedback) + execute(alg, context, feedback) + handleAlgorithmResults(alg, context, feedback) feedback.close() if isinstance(item, TreeActionItem): action = item.action diff --git a/python/plugins/processing/gui/menus.py b/python/plugins/processing/gui/menus.py index 9c161da2507..b61f9c72963 100644 --- a/python/plugins/processing/gui/menus.py +++ b/python/plugins/processing/gui/menus.py @@ -12,6 +12,7 @@ from processing.gui.MessageBarProgress import MessageBarProgress from processing.gui.AlgorithmExecutor import execute from processing.gui.Postprocessing import handleAlgorithmResults from processing.core.Processing import Processing +from processing.tools import dataobjects algorithmsToolbar = None menusSettingsGroup = 'Menus' @@ -202,6 +203,7 @@ def _executeAlgorithm(alg): dlg.exec_() return alg = alg.getCopy() + context = dataobjects.createContext() if (alg.getVisibleParametersCount() + alg.getVisibleOutputsCount()) > 0: dlg = alg.getCustomParametersDialog() if not dlg: @@ -218,8 +220,8 @@ def _executeAlgorithm(alg): canvas.setMapTool(prevMapTool) else: feedback = MessageBarProgress() - execute(alg, None, feedback) - handleAlgorithmResults(alg, feedback) + execute(alg, context, feedback) + handleAlgorithmResults(alg, context, feedback) feedback.close() diff --git a/python/plugins/processing/tests/testdata/scripts/centroids.py b/python/plugins/processing/tests/testdata/scripts/centroids.py index 7b79db7e183..c01103a2ea5 100644 --- a/python/plugins/processing/tests/testdata/scripts/centroids.py +++ b/python/plugins/processing/tests/testdata/scripts/centroids.py @@ -5,13 +5,14 @@ from qgis.core import QgsWkbTypes, QgsGeometry, QgsProcessingUtils -from processing.tools.vector import VectorWriter +from processing.tools.vector import createVectorWriter from processing.tools import dataobjects layer = dataobjects.getLayerFromString(INPUT_LAYER) fields = layer.fields() -writer = VectorWriter(OUTPUT_LAYER, 'utf-8', fields, QgsWkbTypes.Point, layer.crs()) +writer, writer_dest, writer_layer = createVectorWriter(OUTPUT_LAYER, 'utf-8', fields, QgsWkbTypes.Point, layer.crs(), + context) features = QgsProcessingUtils.getFeatures(layer, context) count = QgsProcessingUtils.featureCount(layer, context) diff --git a/python/plugins/processing/tools/vector.py b/python/plugins/processing/tools/vector.py index e286c5d9e09..118e163da3e 100644 --- a/python/plugins/processing/tools/vector.py +++ b/python/plugins/processing/tools/vector.py @@ -521,153 +521,143 @@ def ogrLayerName(uri): return name -class VectorWriter(object): +MEMORY_LAYER_PREFIX = 'memory:' +POSTGIS_LAYER_PREFIX = 'postgis:' +SPATIALITE_LAYER_PREFIX = 'spatialite:' - MEMORY_LAYER_PREFIX = 'memory:' - POSTGIS_LAYER_PREFIX = 'postgis:' - SPATIALITE_LAYER_PREFIX = 'spatialite:' +NOGEOMETRY_EXTENSIONS = [ + u'csv', + u'dbf', + u'ods', + u'xlsx', +] - nogeometry_extensions = [ - u'csv', - u'dbf', - u'ods', - u'xlsx', - ] - def __init__(self, destination, encoding, fields, geometryType, - crs, options=None): - self.destination = destination - self.isNotFileBased = False - self.layer = None - self.writer = None +def createVectorWriter(destination, encoding, fields, geometryType, crs, context, options=None): + layer = None + sink = None - if encoding is None: - settings = QgsSettings() - encoding = settings.value('/Processing/encoding', 'System', str) + if encoding is None: + settings = QgsSettings() + encoding = settings.value('/Processing/encoding', 'System', str) - if self.destination.startswith(self.MEMORY_LAYER_PREFIX): - self.isNotFileBased = True + if destination.startswith(MEMORY_LAYER_PREFIX): + uri = QgsWkbTypes.displayString(geometryType) + "?uuid=" + str(uuid.uuid4()) + if crs.isValid(): + uri += '&crs=' + crs.authid() + fieldsdesc = [] + for f in fields: + qgsfield = _toQgsField(f) + fieldsdesc.append('field=%s:%s' % (qgsfield.name(), + TYPE_MAP_MEMORY_LAYER.get(qgsfield.type(), "string"))) + if fieldsdesc: + uri += '&' + '&'.join(fieldsdesc) - uri = QgsWkbTypes.displayString(geometryType) + "?uuid=" + str(uuid.uuid4()) - if crs.isValid(): - uri += '&crs=' + crs.authid() - fieldsdesc = [] - for f in fields: - qgsfield = _toQgsField(f) - fieldsdesc.append('field=%s:%s' % (qgsfield.name(), - TYPE_MAP_MEMORY_LAYER.get(qgsfield.type(), "string"))) - if fieldsdesc: - uri += '&' + '&'.join(fieldsdesc) + layer = QgsVectorLayer(uri, destination, 'memory') + sink = layer.dataProvider() + context.temporaryLayerStore().addMapLayer(layer, False) + elif destination.startswith(POSTGIS_LAYER_PREFIX): + uri = QgsDataSourceUri(destination[len(POSTGIS_LAYER_PREFIX):]) + connInfo = uri.connectionInfo() + (success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None) + if success: + QgsCredentials.instance().put(connInfo, user, passwd) + else: + raise GeoAlgorithmExecutionException("Couldn't connect to database") + try: + db = postgis.GeoDB(host=uri.host(), port=int(uri.port()), + dbname=uri.database(), user=user, passwd=passwd) + except postgis.DbError as e: + raise GeoAlgorithmExecutionException( + "Couldn't connect to database:\n%s" % e.message) - self.layer = QgsVectorLayer(uri, self.destination, 'memory') - self.writer = self.layer.dataProvider() - elif self.destination.startswith(self.POSTGIS_LAYER_PREFIX): - self.isNotFileBased = True - uri = QgsDataSourceUri(self.destination[len(self.POSTGIS_LAYER_PREFIX):]) - connInfo = uri.connectionInfo() - (success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None) - if success: - QgsCredentials.instance().put(connInfo, user, passwd) - else: - raise GeoAlgorithmExecutionException("Couldn't connect to database") + def _runSQL(sql): try: - db = postgis.GeoDB(host=uri.host(), port=int(uri.port()), - dbname=uri.database(), user=user, passwd=passwd) + db._exec_sql_and_commit(str(sql)) except postgis.DbError as e: raise GeoAlgorithmExecutionException( - "Couldn't connect to database:\n%s" % e.message) + 'Error creating output PostGIS table:\n%s' % e.message) - def _runSQL(sql): - try: - db._exec_sql_and_commit(str(sql)) - except postgis.DbError as e: - raise GeoAlgorithmExecutionException( - 'Error creating output PostGIS table:\n%s' % e.message) + fields = [_toQgsField(f) for f in fields] + fieldsdesc = ",".join('%s %s' % (f.name(), + TYPE_MAP_POSTGIS_LAYER.get(f.type(), "VARCHAR")) + for f in fields) - fields = [_toQgsField(f) for f in fields] - fieldsdesc = ",".join('%s %s' % (f.name(), - TYPE_MAP_POSTGIS_LAYER.get(f.type(), "VARCHAR")) - for f in fields) + _runSQL("CREATE TABLE %s.%s (%s)" % (uri.schema(), uri.table().lower(), fieldsdesc)) + if geometryType != QgsWkbTypes.NullGeometry: + _runSQL("SELECT AddGeometryColumn('{schema}', '{table}', 'the_geom', {srid}, '{typmod}', 2)".format( + table=uri.table().lower(), schema=uri.schema(), srid=crs.authid().split(":")[-1], + typmod=QgsWkbTypes.displayString(geometryType).upper())) - _runSQL("CREATE TABLE %s.%s (%s)" % (uri.schema(), uri.table().lower(), fieldsdesc)) - if geometryType != QgsWkbTypes.NullGeometry: - _runSQL("SELECT AddGeometryColumn('{schema}', '{table}', 'the_geom', {srid}, '{typmod}', 2)".format( - table=uri.table().lower(), schema=uri.schema(), srid=crs.authid().split(":")[-1], - typmod=QgsWkbTypes.displayString(geometryType).upper())) + layer = QgsVectorLayer(uri.uri(), uri.table(), "postgres") + sink = layer.dataProvider() + context.temporaryLayerStore().addMapLayer(layer, False) + elif destination.startswith(SPATIALITE_LAYER_PREFIX): + uri = QgsDataSourceUri(destination[len(SPATIALITE_LAYER_PREFIX):]) + try: + db = spatialite.GeoDB(uri=uri) + except spatialite.DbError as e: + raise GeoAlgorithmExecutionException( + "Couldn't connect to database:\n%s" % e.message) - self.layer = QgsVectorLayer(uri.uri(), uri.table(), "postgres") - self.writer = self.layer.dataProvider() - elif self.destination.startswith(self.SPATIALITE_LAYER_PREFIX): - self.isNotFileBased = True - uri = QgsDataSourceUri(self.destination[len(self.SPATIALITE_LAYER_PREFIX):]) + def _runSQL(sql): try: - db = spatialite.GeoDB(uri=uri) + db._exec_sql_and_commit(str(sql)) except spatialite.DbError as e: raise GeoAlgorithmExecutionException( - "Couldn't connect to database:\n%s" % e.message) + 'Error creating output Spatialite table:\n%s' % str(e)) - def _runSQL(sql): - try: - db._exec_sql_and_commit(str(sql)) - except spatialite.DbError as e: - raise GeoAlgorithmExecutionException( - 'Error creating output Spatialite table:\n%s' % str(e)) + fields = [_toQgsField(f) for f in fields] + fieldsdesc = ",".join('%s %s' % (f.name(), + TYPE_MAP_SPATIALITE_LAYER.get(f.type(), "VARCHAR")) + for f in fields) - fields = [_toQgsField(f) for f in fields] - fieldsdesc = ",".join('%s %s' % (f.name(), - TYPE_MAP_SPATIALITE_LAYER.get(f.type(), "VARCHAR")) - for f in fields) + _runSQL("DROP TABLE IF EXISTS %s" % uri.table().lower()) + _runSQL("CREATE TABLE %s (%s)" % (uri.table().lower(), fieldsdesc)) + if geometryType != QgsWkbTypes.NullGeometry: + _runSQL("SELECT AddGeometryColumn('{table}', 'the_geom', {srid}, '{typmod}', 2)".format( + table=uri.table().lower(), srid=crs.authid().split(":")[-1], + typmod=QgsWkbTypes.displayString(geometryType).upper())) - _runSQL("DROP TABLE IF EXISTS %s" % uri.table().lower()) - _runSQL("CREATE TABLE %s (%s)" % (uri.table().lower(), fieldsdesc)) - if geometryType != QgsWkbTypes.NullGeometry: - _runSQL("SELECT AddGeometryColumn('{table}', 'the_geom', {srid}, '{typmod}', 2)".format( - table=uri.table().lower(), srid=crs.authid().split(":")[-1], - typmod=QgsWkbTypes.displayString(geometryType).upper())) + layer = QgsVectorLayer(uri.uri(), uri.table(), "spatialite") + sink = layer.dataProvider() + context.temporaryLayerStore().addMapLayer(layer, False) + else: + formats = QgsVectorFileWriter.supportedFiltersAndFormats() + OGRCodes = {} + for (key, value) in list(formats.items()): + extension = str(key) + extension = extension[extension.find('*.') + 2:] + extension = extension[:extension.find(' ')] + OGRCodes[extension] = value + OGRCodes['dbf'] = "DBF file" - self.layer = QgsVectorLayer(uri.uri(), uri.table(), "spatialite") - self.writer = self.layer.dataProvider() - else: - formats = QgsVectorFileWriter.supportedFiltersAndFormats() - OGRCodes = {} - for (key, value) in list(formats.items()): - extension = str(key) - extension = extension[extension.find('*.') + 2:] - extension = extension[:extension.find(' ')] - OGRCodes[extension] = value - OGRCodes['dbf'] = "DBF file" + extension = destination[destination.rfind('.') + 1:] - extension = self.destination[self.destination.rfind('.') + 1:] + if extension not in OGRCodes: + extension = 'shp' + destination = destination + '.shp' - if extension not in OGRCodes: - extension = 'shp' - self.destination = self.destination + '.shp' + if geometryType == QgsWkbTypes.NoGeometry: + if extension == 'shp': + extension = 'dbf' + destination = destination[:destination.rfind('.')] + '.dbf' + if extension not in NOGEOMETRY_EXTENSIONS: + raise GeoAlgorithmExecutionException( + "Unsupported format for tables with no geometry") - if geometryType == QgsWkbTypes.NoGeometry: - if extension == 'shp': - extension = 'dbf' - self.destination = self.destination[:self.destination.rfind('.')] + '.dbf' - if extension not in self.nogeometry_extensions: - raise GeoAlgorithmExecutionException( - "Unsupported format for tables with no geometry") + qgsfields = QgsFields() + for field in fields: + qgsfields.append(_toQgsField(field)) - qgsfields = QgsFields() - for field in fields: - qgsfields.append(_toQgsField(field)) + # use default dataset/layer options + dataset_options = QgsVectorFileWriter.defaultDatasetOptions(OGRCodes[extension]) + layer_options = QgsVectorFileWriter.defaultLayerOptions(OGRCodes[extension]) - # use default dataset/layer options - dataset_options = QgsVectorFileWriter.defaultDatasetOptions(OGRCodes[extension]) - layer_options = QgsVectorFileWriter.defaultLayerOptions(OGRCodes[extension]) - - self.writer = QgsVectorFileWriter(self.destination, encoding, - qgsfields, geometryType, crs, OGRCodes[extension], - dataset_options, layer_options) - - def addFeature(self, feature): - if self.isNotFileBased: - self.writer.addFeatures([feature]) - else: - self.writer.addFeature(feature) + sink = QgsVectorFileWriter(destination, encoding, + qgsfields, geometryType, crs, OGRCodes[extension], + dataset_options, layer_options) + return sink, destination, layer class TableWriter(object): diff --git a/src/core/processing/qgsprocessingcontext.h b/src/core/processing/qgsprocessingcontext.h index 26432fd1a95..ad58cd41c16 100644 --- a/src/core/processing/qgsprocessingcontext.h +++ b/src/core/processing/qgsprocessingcontext.h @@ -89,16 +89,11 @@ class CORE_EXPORT QgsProcessingContext */ void setExpressionContext( const QgsExpressionContext &context ) { mExpressionContext = context; } -///@cond NOT_STABLE_API - /** * Returns a reference to the project used for storing temporary layers during * algorithm execution. - * \note not available in Python bindings */ - SIP_SKIP QgsProject &temporaryLayerStore() { return tempProject; } - -///@endcond + QgsProject &temporaryLayerStore() { return tempProject; } /** * Returns the behavior used for checking invalid geometries in input layers.