Skip to content

Commit 45eac05

Browse files
committed
Restore vector split algorithm
1 parent d8c44cb commit 45eac05

File tree

2 files changed

+48
-23
lines changed

2 files changed

+48
-23
lines changed

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@
6060
from .PostGISExecuteSQL import PostGISExecuteSQL
6161
from .RegularPoints import RegularPoints
6262
from .SymmetricalDifference import SymmetricalDifference
63+
from .VectorSplit import VectorSplit
6364

64-
# from .VectorSplit import VectorSplit
6565
# from .RandomExtract import RandomExtract
6666
# from .RandomExtractWithinSubsets import RandomExtractWithinSubsets
6767
# from .ExtractByLocation import ExtractByLocation
@@ -201,7 +201,6 @@ def getAlgs(self):
201201
# SelectByLocation(), RandomExtract(),
202202
# RandomExtractWithinSubsets(), ExtractByLocation(),
203203
# SpatialJoin(),
204-
# VectorSplit(),
205204
# DeleteDuplicateGeometries(), TextToFloat(),
206205
# SelectByAttribute(),
207206
# GridLine(), Gridify(), HubDistancePoints(),
@@ -263,7 +262,8 @@ def getAlgs(self):
263262
Merge(),
264263
PostGISExecuteSQL(),
265264
RegularPoints(),
266-
SymmetricalDifference()
265+
SymmetricalDifference(),
266+
VectorSplit()
267267
]
268268

269269
if hasPlotly:

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

+45-20
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@
2929
import os
3030

3131
from qgis.PyQt.QtGui import QIcon
32-
from qgis.core import QgsProcessingUtils
32+
from qgis.core import (QgsProcessingUtils,
33+
QgsProcessingParameterFeatureSource,
34+
QgsProcessingParameterField,
35+
QgsProcessingParameterFolderOutput,
36+
QgsProcessingOutputFolder,
37+
QgsExpression,
38+
QgsFeatureRequest)
3339

3440
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3541
from processing.core.parameters import ParameterVector
@@ -55,11 +61,17 @@ def group(self):
5561

5662
def __init__(self):
5763
super().__init__()
58-
self.addParameter(ParameterVector(self.INPUT,
59-
self.tr('Input layer')))
60-
self.addParameter(ParameterTableField(self.FIELD,
61-
self.tr('Unique ID field'), self.INPUT))
62-
self.addOutput(OutputDirectory(self.OUTPUT, self.tr('Output directory')))
64+
65+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
66+
self.tr('Input layer')))
67+
68+
self.addParameter(QgsProcessingParameterField(self.FIELD,
69+
self.tr('Unique ID field'), None, self.INPUT))
70+
71+
self.addParameter(QgsProcessingParameterFolderOutput(self.OUTPUT,
72+
self.tr('Output directory')))
73+
74+
self.addOutput(QgsProcessingOutputFolder(self.OUTPUT, self.tr('Output directory')))
6375

6476
def name(self):
6577
return 'splitvectorlayer'
@@ -68,29 +80,42 @@ def displayName(self):
6880
return self.tr('Split vector layer')
6981

7082
def processAlgorithm(self, parameters, context, feedback):
71-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
72-
fieldName = self.getParameterValue(self.FIELD)
73-
directory = self.getOutputValue(self.OUTPUT)
83+
source = self.parameterAsSource(parameters, self.INPUT, context)
84+
fieldName = self.parameterAsString(parameters, self.FIELD, context)
85+
directory = self.parameterAsString(parameters, self.OUTPUT, context)
7486

7587
mkdir(directory)
7688

77-
fieldIndex = layer.fields().lookupField(fieldName)
78-
uniqueValues = QgsProcessingUtils.uniqueValues(layer, fieldIndex, context)
79-
baseName = os.path.join(directory, '{0}_{1}'.format(layer.name(), fieldName))
89+
fieldIndex = source.fields().lookupField(fieldName)
90+
uniqueValues = source.uniqueValues(fieldIndex)
91+
baseName = os.path.join(directory, '{0}'.format(fieldName))
8092

81-
fields = layer.fields()
82-
crs = layer.crs()
83-
geomType = layer.wkbType()
93+
fields = source.fields()
94+
crs = source.sourceCrs()
95+
geomType = source.wkbType()
8496

8597
total = 100.0 / len(uniqueValues)
8698

8799
for current, i in enumerate(uniqueValues):
100+
if feedback.isCanceled():
101+
break
88102
fName = u'{0}_{1}.shp'.format(baseName, str(i).strip())
103+
feedback.pushInfo(self.tr('Creating layer: {}').format(fName))
89104

90-
writer, dest = QgsProcessingUtils.createFeatureSink(fName, context, fields, geomType, crs)
91-
for f in QgsProcessingUtils.getFeatures(layer, context):
92-
if f[fieldName] == i:
93-
writer.addFeature(f)
94-
del writer
105+
sink, dest = QgsProcessingUtils.createFeatureSink(fName, context, fields, geomType, crs)
106+
107+
filter = '{} = {}'.format(QgsExpression.quotedColumnRef(fieldName), QgsExpression.quotedValue(i))
108+
req = QgsFeatureRequest().setFilterExpression(filter)
109+
110+
count = 0
111+
for f in source.getFeatures(req):
112+
if feedback.isCanceled():
113+
break
114+
sink.addFeature(f)
115+
count += 1
116+
feedback.pushInfo(self.tr('Added {} features to layer').format(count))
117+
del sink
95118

96119
feedback.setProgress(int(current * total))
120+
121+
return {self.OUTPUT: directory}

0 commit comments

Comments
 (0)