Skip to content

Commit 286fdbd

Browse files
committed
ValueChangeSplitter
1 parent c600060 commit 286fdbd

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

qgis_processing/splitTrajectoriesAlgorithm.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import sys
22
import pandas as pd
33

4-
from movingpandas import TemporalSplitter, ObservationGapSplitter, StopSplitter
4+
from movingpandas import (
5+
TemporalSplitter,
6+
ObservationGapSplitter,
7+
StopSplitter,
8+
ValueChangeSplitter,
9+
)
510

611
from qgis.core import (
712
QgsProcessingParameterString,
813
QgsProcessingParameterEnum,
914
QgsProcessingParameterNumber,
15+
QgsProcessingParameterField,
1016
)
1117

1218
sys.path.append("..")
@@ -202,3 +208,50 @@ def processTc(self, tc, parameters, context):
202208
self.tc_to_sink(splits)
203209
for split in splits:
204210
self.traj_to_sink(split)
211+
212+
213+
class ValueChangeSplitterAlgorithm(SplitTrajectoriesAlgorithm):
214+
FIELD = "FIELD"
215+
216+
def __init__(self):
217+
super().__init__()
218+
219+
def initAlgorithm(self, config=None):
220+
super().initAlgorithm(config)
221+
self.addParameter(
222+
QgsProcessingParameterField(
223+
name=self.FIELD,
224+
description=self.tr("Field to check for changing values"),
225+
parentLayerParameterName=self.INPUT,
226+
type=QgsProcessingParameterField.Any,
227+
allowMultiple=False,
228+
optional=False,
229+
)
230+
)
231+
232+
def name(self):
233+
return "split_value_change"
234+
235+
def displayName(self):
236+
return self.tr("Split trajectories when field value changes")
237+
238+
def shortHelpString(self):
239+
return self.tr(
240+
"<p>Splits trajectories into subtrajectories "
241+
"whenever there is a change in the specified field's value.</p>"
242+
"<p>For more information on trajectory splitters see: "
243+
"https://movingpandas.readthedocs.io/en/main/api/trajectorysplitter.html</p>"
244+
"<p><b>Speed</b> is calculated based on the input layer CRS information and "
245+
"converted to the desired speed units. For more info on the supported units, "
246+
"see https://movingpandas.org/units</p>"
247+
"<p><b>Direction</b> is calculated between consecutive locations. Direction "
248+
"values are in degrees, starting North turning clockwise.</p>"
249+
)
250+
251+
def processTc(self, tc, parameters, context):
252+
self.field = self.parameterAsFields(parameters, self.FIELD, context)[0]
253+
for traj in tc.trajectories:
254+
splits = ValueChangeSplitter(traj).split(col_name=self.field)
255+
self.tc_to_sink(splits)
256+
for split in splits:
257+
self.traj_to_sink(split)

qgis_processing/trajectoolsProvider.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
ObservationGapSplitterAlgorithm,
1414
TemporalSplitterAlgorithm,
1515
StopSplitterAlgorithm,
16+
ValueChangeSplitterAlgorithm,
1617
)
1718
from .overlayAlgorithm import (
1819
ClipTrajectoriesByExtentAlgorithm,
@@ -89,6 +90,7 @@ def getAlgs(self):
8990
ObservationGapSplitterAlgorithm(),
9091
TemporalSplitterAlgorithm(),
9192
StopSplitterAlgorithm(),
93+
ValueChangeSplitterAlgorithm(),
9294
ClipTrajectoriesByExtentAlgorithm(),
9395
ClipTrajectoriesByPolygonLayerAlgorithm(),
9496
IntersectWithPolygonLayerAlgorithm(),

0 commit comments

Comments
 (0)