Skip to content

Commit 59b7111

Browse files
committed
Create proper datetime fields
1 parent 3ee073f commit 59b7111

File tree

4 files changed

+23
-18
lines changed

4 files changed

+23
-18
lines changed

metadata.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name=Trajectools
33
description=Processing tools for handling trajectory data
44
about=Trajectools adds trajectory analysis algorithms to the QGIS Processing toolbox. Trajectools requires MovingPandas >= 0.22.3 and optionally integrates scikit-mobility (for privacy tests), stonesoup (for smoothing), and gtfs_functions (for GTFS data support). See the plugin homepage for installation recommendations. Sample data for testing the functionality is provided with the plugin download.
55
category=Plugins
6-
version=2.6.1
6+
version=2.6.2
77
qgisMinimumVersion=3.0
88
qgisMaximumVersion=4.0
99

@@ -20,7 +20,9 @@ repository=https://codeberg.org/movingpandas/trajectools
2020
experimental=False
2121
deprecated=False
2222

23-
changelog=2.6.1
23+
changelog=2.6.2
24+
- Create proper datetime fields
25+
2.6.1
2426
- Added minimum MovingPandas version warning
2527
2.6
2628
- Set minimum MovingPandas version to 0.22.3

qgis_processing/extractPtsAlgorithm.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import os
22
import sys
33

4-
import shapely.wkt
5-
from shapely.geometry import Polygon
4+
import pandas as pd
5+
from movingpandas import TrajectoryStopDetector
66

77
from qgis.PyQt.QtCore import QCoreApplication, QVariant
88
from qgis.core import (
@@ -19,14 +19,10 @@
1919
)
2020
from qgis.core import QgsMessageLog, Qgis
2121

22-
import pandas as pd
23-
from geopandas import GeoDataFrame
24-
from movingpandas import TrajectoryStopDetector
25-
2622
sys.path.append("..")
2723

2824
from .trajectoriesAlgorithm import TrajectoriesAlgorithm
29-
from .qgisUtils import feature_from_gdf_row, feature_from_df_row
25+
from .qgisUtils import feature_from_gdf_row
3026

3127

3228
CPU_COUNT = os.cpu_count()
@@ -186,8 +182,8 @@ def processAlgorithm(self, parameters, context, feedback):
186182

187183
self.fields_pts = QgsFields()
188184
self.fields_pts.append(QgsField("stop_id", QVariant.String))
189-
self.fields_pts.append(QgsField("start_time", QVariant.String)) # .DateTime))
190-
self.fields_pts.append(QgsField("end_time", QVariant.String)) # .DateTime))
185+
self.fields_pts.append(QgsField("start_time", QVariant.DateTime))
186+
self.fields_pts.append(QgsField("end_time", QVariant.DateTime))
191187
self.fields_pts.append(QgsField("traj_id", QVariant.String))
192188
self.fields_pts.append(QgsField("duration_s", QVariant.Double))
193189

@@ -214,8 +210,6 @@ def processTc(self, tc, parameters, context):
214210
)
215211
gdf = gdf.convert_dtypes()
216212
gdf["stop_id"] = gdf.index.astype(str)
217-
gdf["start_time"] = gdf["start_time"].astype(str)
218-
gdf["end_time"] = gdf["end_time"].astype(str)
219213

220214
names = [field.name() for field in self.fields_pts]
221215
names.append("geometry")

qgis_processing/qgisUtils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import pandas as pd
55
from os import path
66
from pyproj import CRS
7+
from datetime import datetime
8+
79
from qgis.core import (
810
QgsFeature,
911
QgsGeometry,
@@ -134,6 +136,9 @@ def feature_from_gdf_row(row):
134136
f = QgsFeature()
135137
f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(row.geometry.x, row.geometry.y)))
136138
values = row.values.tolist()[:-1]
139+
for i, value in enumerate(values):
140+
if isinstance(value, datetime):
141+
values[i] = QDateTime.fromSecsSinceEpoch(int(value.timestamp()))
137142
# for v in values:
138143
# QgsMessageLog.logMessage(str(type(v)), "Trajectools", level=Qgis.Info )
139144
f.setAttributes(values)

qgis_processing/trajectoriesAlgorithm.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os
22
import sys
33

4-
from qgis.PyQt.QtCore import QCoreApplication, QVariant
4+
from qgis.PyQt.QtCore import QCoreApplication, QVariant, QDateTime, Qt
55
from qgis.PyQt.QtGui import QIcon
66
from qgis.core import (
77
QgsProcessing,
@@ -27,7 +27,6 @@
2727
set_multiprocess_path,
2828
tc_from_pt_layer,
2929
feature_from_gdf_row,
30-
feature_from_df_row,
3130
df_from_pt_layer,
3231
)
3332

@@ -153,6 +152,8 @@ def get_pt_fields(self, fields_to_add=[]):
153152
elif field.name() == self.traj_id_field:
154153
# we need to make sure the ID field is String
155154
fields.append(QgsField(self.traj_id_field, QVariant.String))
155+
elif field.name() == self.timestamp_field:
156+
fields.append(QgsField(self.timestamp_field, QVariant.DateTime))
156157
else:
157158
fields.append(field)
158159
for field in fields_to_add:
@@ -274,8 +275,8 @@ def get_traj_fields(self, fields_to_add=[]):
274275
speed_units = f"{self.speed_units[0]}{self.speed_units[1]}"
275276
fields = QgsFields()
276277
fields.append(QgsField(self.traj_id_field, QVariant.String))
277-
fields.append(QgsField("start_time", QVariant.String))
278-
fields.append(QgsField("end_time", QVariant.String))
278+
fields.append(QgsField("start_time", QVariant.DateTime))
279+
fields.append(QgsField("end_time", QVariant.DateTime))
279280
fields.append(QgsField("duration_seconds", QVariant.Double))
280281
fields.append(QgsField(f"length_{length_units}", QVariant.Double))
281282
fields.append(QgsField(f"speed_{speed_units}", QVariant.Double))
@@ -293,7 +294,9 @@ def traj_to_sink(self, traj, attr_mean_to_add=[], attr_first_to_add=[]):
293294
f = QgsFeature()
294295
f.setGeometry(line)
295296
start_time = traj.get_start_time().isoformat()
297+
start_time = QDateTime.fromString(start_time, Qt.ISODate)
296298
end_time = traj.get_end_time().isoformat()
299+
end_time = QDateTime.fromString(end_time, Qt.ISODate)
297300
duration = float(traj.get_duration().total_seconds())
298301
length = traj.get_length(units=self.speed_units[0])
299302
speed = length / (duration / TIME_FACTOR[self.speed_units[1]])
@@ -321,7 +324,8 @@ def tc_to_sink(self, tc, field_names_to_add=[]):
321324
dfs = tc.to_point_gdf()
322325
except ValueError: # when the tc is empty
323326
return
324-
dfs[self.timestamp_field] = dfs.index.astype(str)
327+
dfs[self.timestamp_field] = dfs.index
328+
325329
names = [field.name() for field in self.fields_pts]
326330
for field_name in field_names_to_add:
327331
names.append(field_name)

0 commit comments

Comments
 (0)