30
30
31
31
from qgis .core import (QgsFeature ,
32
32
QgsFeatureSink ,
33
- QgsApplication ,
34
- QgsProcessingUtils )
33
+ QgsFeatureRequest ,
34
+ QgsProcessingParameterFeatureSource ,
35
+ QgsProcessingUtils ,
36
+ QgsProcessingParameterField ,
37
+ QgsProcessingParameterFeatureSink )
35
38
36
39
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
37
- from processing .core .parameters import ParameterVector
38
- from processing .core .parameters import ParameterTable
39
- from processing .core .parameters import ParameterTableField
40
- from processing .core .outputs import OutputVector
41
40
from processing .tools import vector
42
41
43
42
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
44
43
45
44
46
45
class JoinAttributes (QgisAlgorithm ):
47
46
48
- OUTPUT_LAYER = 'OUTPUT_LAYER '
49
- INPUT_LAYER = 'INPUT_LAYER '
50
- INPUT_LAYER_2 = 'INPUT_LAYER_2 '
51
- TABLE_FIELD = 'TABLE_FIELD '
52
- TABLE_FIELD_2 = 'TABLE_FIELD_2 '
47
+ OUTPUT = 'OUTPUT '
48
+ INPUT = 'INPUT '
49
+ INPUT_2 = 'INPUT_2 '
50
+ FIELD = 'FIELD '
51
+ FIELD_2 = 'FIELD_2 '
53
52
54
53
def group (self ):
55
54
return self .tr ('Vector general tools' )
@@ -58,16 +57,15 @@ def __init__(self):
58
57
super ().__init__ ()
59
58
60
59
def initAlgorithm (self , config = None ):
61
- self .addParameter (ParameterVector (self .INPUT_LAYER ,
62
- self .tr ('Input layer' )))
63
- self .addParameter (ParameterTable (self .INPUT_LAYER_2 ,
64
- self .tr ('Input layer 2' ), False ))
65
- self .addParameter (ParameterTableField (self .TABLE_FIELD ,
66
- self .tr ('Table field' ), self .INPUT_LAYER ))
67
- self .addParameter (ParameterTableField (self .TABLE_FIELD_2 ,
68
- self .tr ('Table field 2' ), self .INPUT_LAYER_2 ))
69
- self .addOutput (OutputVector (self .OUTPUT_LAYER ,
70
- self .tr ('Joined layer' )))
60
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
61
+ self .tr ('Input layer' )))
62
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT_2 ,
63
+ self .tr ('Input layer 2' )))
64
+ self .addParameter (QgsProcessingParameterField (self .FIELD ,
65
+ self .tr ('Table field' ), parentLayerParameterName = self .INPUT ))
66
+ self .addParameter (QgsProcessingParameterField (self .FIELD_2 ,
67
+ self .tr ('Table field 2' ), parentLayerParameterName = self .INPUT_2 ))
68
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Joined layer' )))
71
69
72
70
def name (self ):
73
71
return 'joinattributestable'
@@ -76,26 +74,27 @@ def displayName(self):
76
74
return self .tr ('Join attributes table' )
77
75
78
76
def processAlgorithm (self , parameters , context , feedback ):
79
- input = self .getParameterValue (self .INPUT_LAYER )
80
- input2 = self .getParameterValue (self .INPUT_LAYER_2 )
81
- output = self .getOutputFromName (self .OUTPUT_LAYER )
82
- field = self .getParameterValue (self .TABLE_FIELD )
83
- field2 = self .getParameterValue (self .TABLE_FIELD_2 )
77
+ input = self .parameterAsSource (parameters , self .INPUT , context )
78
+ input2 = self .parameterAsSource (parameters , self .INPUT_2 , context )
79
+ field = self .parameterAsString (parameters , self .FIELD , context )
80
+ field2 = self .parameterAsString (parameters , self .FIELD_2 , context )
84
81
85
- layer = QgsProcessingUtils . mapLayerFromString ( input , context )
86
- joinField1Index = layer .fields ().lookupField (field )
82
+ joinField1Index = input . fields (). lookupField ( field )
83
+ joinField2Index = input2 .fields ().lookupField (field2 )
87
84
88
- layer2 = QgsProcessingUtils .mapLayerFromString (input2 , context )
89
- joinField2Index = layer2 .fields ().lookupField (field2 )
85
+ outFields = vector .combineFields (input .fields (), input2 .fields ())
90
86
91
- outFields = vector . combineVectorFields ( layer , layer2 )
92
- writer = output . getVectorWriter ( outFields , layer .wkbType (), layer . crs (), context )
87
+ ( sink , dest_id ) = self . parameterAsSink ( parameters , self . OUTPUT , context ,
88
+ outFields , input .wkbType (), input . sourceCrs () )
93
89
94
- # Cache attributes of Layer 2
90
+ # Cache attributes of input2
95
91
cache = {}
96
- features = QgsProcessingUtils .getFeatures (layer2 , context )
97
- total = 100.0 / layer2 .featureCount () if layer2 .featureCount () else 0
92
+ features = input2 .getFeatures (QgsFeatureRequest (). setFlags ( QgsFeatureRequest . NoGeometry ) )
93
+ total = 100.0 / input2 .featureCount () if input2 .featureCount () else 0
98
94
for current , feat in enumerate (features ):
95
+ if feedback .isCanceled ():
96
+ break
97
+
99
98
attrs = feat .attributes ()
100
99
joinValue2 = str (attrs [joinField2Index ])
101
100
if joinValue2 not in cache :
@@ -104,14 +103,18 @@ def processAlgorithm(self, parameters, context, feedback):
104
103
105
104
# Create output vector layer with additional attribute
106
105
outFeat = QgsFeature ()
107
- features = QgsProcessingUtils .getFeatures (layer , context )
108
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
106
+ features = input .getFeatures ()
107
+ total = 100.0 / input .featureCount () if input .featureCount () else 0
109
108
for current , feat in enumerate (features ):
109
+ if feedback .isCanceled ():
110
+ break
111
+
110
112
outFeat .setGeometry (feat .geometry ())
111
113
attrs = feat .attributes ()
112
114
joinValue1 = str (attrs [joinField1Index ])
113
115
attrs .extend (cache .get (joinValue1 , []))
114
116
outFeat .setAttributes (attrs )
115
- writer .addFeature (outFeat , QgsFeatureSink .FastInsert )
117
+ sink .addFeature (outFeat , QgsFeatureSink .FastInsert )
116
118
feedback .setProgress (int (current * total ))
117
- del writer
119
+
120
+ return {self .OUTPUT : dest_id }
0 commit comments