8
8
from collections import namedtuple
9
9
from datetime import datetime , timedelta , timezone
10
10
from hashlib import md5
11
+ from typing import List
11
12
from urllib .parse import quote
12
13
13
14
import gpxpy
@@ -187,6 +188,23 @@ def parse_content_to_ponits(content):
187
188
points = []
188
189
return points
189
190
191
+ class Pause :
192
+ def __init__ (self , pause_data_point : List [str ]):
193
+ self .index = int (pause_data_point [0 ])
194
+ self .duration = int (pause_data_point [1 ])
195
+
196
+ def __repr__ (self ):
197
+ return f"Pause(index=${ self .index } , duration=${ self .duration } )"
198
+
199
+ class PauseList :
200
+ def __init__ (self , pause_list : List [List [str ]]):
201
+ self ._list = []
202
+ for pause in pause_list :
203
+ self ._list .append (Joyrun .Pause (pause ))
204
+
205
+ def next (self ) -> "Joyrun.Pause" :
206
+ return self ._list .pop (0 ) if self ._list else None
207
+
190
208
@staticmethod
191
209
def parse_points_to_gpx (
192
210
run_points_data , start_time , end_time , pause_list , interval = 5
@@ -200,49 +218,55 @@ def parse_points_to_gpx(
200
218
:param interval: time interval between each point, in seconds
201
219
"""
202
220
203
- # format data
204
- segment_list = []
205
- points_dict_list = []
206
- current_time = start_time
221
+ # GPX instance
222
+ gpx = gpxpy .gpx .GPX ()
223
+ gpx .nsmap ["gpxtpx" ] = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
224
+
225
+ # GPX Track
226
+ track = gpxpy .gpx .GPXTrack ()
227
+ track .name = f"gpx from joyrun { start_time } "
228
+ gpx .tracks .append (track )
229
+
230
+ # GPX Track Segment
231
+ track_segment = gpxpy .gpx .GPXTrackSegment ()
232
+ track .segments .append (track_segment )
207
233
234
+ # Initialize Pause
235
+ pause_list = Joyrun .PauseList (pause_list )
236
+ pause = pause_list .next ()
237
+
238
+ current_time = start_time
208
239
for index , point in enumerate (run_points_data [:- 1 ]):
209
- points_dict = {
210
- "latitude" : point [0 ],
211
- "longitude" : point [1 ],
212
- "time" : datetime .fromtimestamp (current_time , tz = timezone .utc ),
213
- }
214
- points_dict_list .append (points_dict )
240
+ # New Track Point
241
+ track_point = gpxpy .gpx .GPXTrackPoint (
242
+ latitude = point [0 ],
243
+ longitude = point [1 ],
244
+ time = datetime .fromtimestamp (current_time , tz = timezone .utc ),
245
+ )
246
+ track_segment .points .append (track_point )
215
247
248
+ # Increment time
216
249
current_time += interval
217
- if pause_list and int (pause_list [0 ][0 ]) - 1 == index :
218
- segment_list .append (points_dict_list [:])
219
- points_dict_list .clear ()
220
- current_time += int (pause_list [0 ][1 ])
221
- pause_list .pop (0 )
222
-
223
- points_dict_list .append (
224
- {
225
- "latitude" : run_points_data [- 1 ][0 ],
226
- "longitude" : run_points_data [- 1 ][1 ],
227
- "time" : datetime .fromtimestamp (end_time , tz = timezone .utc ),
228
- }
229
- )
230
- segment_list .append (points_dict_list )
231
250
232
- # gpx part
233
- gpx = gpxpy .gpx .GPX ()
234
- gpx .nsmap ["gpxtpx" ] = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
235
- gpx_track = gpxpy .gpx .GPXTrack ()
236
- gpx_track .name = "gpx from joyrun"
237
- gpx .tracks .append (gpx_track )
238
-
239
- # add segment list to our GPX track:
240
- for point_list in segment_list :
241
- gpx_segment = gpxpy .gpx .GPXTrackSegment ()
242
- gpx_track .segments .append (gpx_segment )
243
- for p in point_list :
244
- point = gpxpy .gpx .GPXTrackPoint (** p )
245
- gpx_segment .points .append (point )
251
+ # Check pause
252
+ if pause and pause .index - 1 == index :
253
+ # New Segment
254
+ track_segment = gpxpy .gpx .GPXTrackSegment ()
255
+ track .segments .append (track_segment )
256
+ # Add paused duration
257
+ current_time += pause .duration
258
+ # Next pause
259
+ pause = pause_list .next ()
260
+
261
+ # Last Track Point uses end_time
262
+ last_point = run_points_data [- 1 ]
263
+ track_segment .points .append (
264
+ gpxpy .gpx .GPXTrackPoint (
265
+ latitude = last_point [0 ],
266
+ longitude = last_point [1 ],
267
+ time = datetime .fromtimestamp (end_time , tz = timezone .utc ),
268
+ )
269
+ )
246
270
247
271
return gpx .to_xml ()
248
272
0 commit comments