@@ -162,6 +162,7 @@ def get_pt_fields(self, fields_to_add=[]):
162
162
163
163
164
164
class TrajectoryManipulationAlgorithm (TrajectoriesAlgorithm ):
165
+ FIELDS_TO_ADD = "FIELDS_TO_ADD"
165
166
OUTPUT_PTS = "OUTPUT_PTS"
166
167
OUTPUT_SEGS = "OUTPUT_SEGS"
167
168
OUTPUT_TRAJS = "OUTPUT_TRAJS"
@@ -182,6 +183,16 @@ def initAlgorithm(self, config=None):
182
183
type = QgsProcessing .TypeVectorLine ,
183
184
)
184
185
)
186
+ self .addParameter (
187
+ QgsProcessingParameterField (
188
+ name = self .FIELDS_TO_ADD ,
189
+ description = self .tr ("Fields to add to trajectories (line) layer" ),
190
+ parentLayerParameterName = self .INPUT ,
191
+ type = QgsProcessingParameterField .Any ,
192
+ allowMultiple = True ,
193
+ optional = True ,
194
+ )
195
+ )
185
196
186
197
def processAlgorithm (self , parameters , context , feedback ):
187
198
tc , crs = self .create_tc (parameters , context )
@@ -195,7 +206,10 @@ def processAlgorithm(self, parameters, context, feedback):
195
206
return {self .OUTPUT_PTS : self .dest_pts , self .OUTPUT_TRAJS : self .dest_trajs }
196
207
197
208
def setup_traj_sink (self , parameters , context , crs ):
198
- self .fields_trajs = self .get_traj_fields ()
209
+ self .fields_to_add = self .parameterAsFields (
210
+ parameters , self .FIELDS_TO_ADD , context
211
+ )
212
+ self .fields_trajs = self .get_traj_fields (fields_to_add = self .fields_to_add )
199
213
(self .sink_trajs , self .dest_trajs ) = self .parameterAsSink (
200
214
parameters ,
201
215
self .OUTPUT_TRAJS ,
@@ -242,9 +256,12 @@ def get_traj_fields(self, fields_to_add=[]):
242
256
fields .append (QgsField (f"length_{ length_units } " , QVariant .Double ))
243
257
fields .append (QgsField (f"speed_{ speed_units } " , QVariant .Double ))
244
258
for field in fields_to_add :
245
- i = fields .indexFromName (field .name ())
246
- if i < 0 :
247
- fields .append (field )
259
+ if isinstance (field , str ):
260
+ if fields .indexFromName (field ) < 0 :
261
+ fields .append (self .input_layer .fields ().field (field ))
262
+ else :
263
+ if fields .indexFromName (field .name ()) < 0 :
264
+ fields .append (field )
248
265
return fields
249
266
250
267
def traj_to_sink (self , traj , attr_mean_to_add = [], attr_first_to_add = []):
@@ -257,6 +274,7 @@ def traj_to_sink(self, traj, attr_mean_to_add=[], attr_first_to_add=[]):
257
274
length = traj .get_length (units = self .speed_units [0 ])
258
275
speed = length / (duration / TIME_FACTOR [self .speed_units [1 ]])
259
276
attrs = [traj .id , start_time , end_time , duration , length , speed ]
277
+ attr_first_to_add = self .fields_to_add + attr_first_to_add
260
278
for a in attr_mean_to_add :
261
279
attrs .append (float (traj .df [a ].mean ()))
262
280
for a in attr_first_to_add :
0 commit comments