bicycle-statistics/gpx_parser/__init__.py

120 lines
4.1 KiB
Python
Raw Permalink Normal View History

import datetime
import glob
import os
import gpxpy
import gpxpy.gpx
from geopy import distance
from geopy import Point
import pandas as pd
class Segment(object):
start_time = None
end_time = None
distance = 0.0 # [m]
class Track(object):
start_time = None
end_time = None
distance = 0.0 # [m]
avg_speed = 0.0 # [km/h]
duration = None
def __init__(self, raw_track):
for segment in raw_track.segments:
seg = Segment()
for i in range(1, len(segment.points)):
if self.start_time is None:
self.start_time = segment.points[i - 1].time
if seg.start_time is None:
seg.start_time = segment.points[i - 1].time
seg.end_time = segment.points[i - 1].time
point1 = Point(str(segment.points[i - 1].latitude) + \
' ' + str(segment.points[i - 1].longitude))
point2 = Point(str(segment.points[i].latitude) + \
' ' + str(segment.points[i].longitude))
seg.distance += distance.distance(point1, point2).meters
try:
if self.duration is None:
self.duration = seg.end_time - seg.start_time
else:
self.duration += seg.end_time - seg.start_time
except Exception:
# TODO: Add logging mechanism.
pass
self.end_time = seg.end_time
self.distance += seg.distance
self.avg_speed = self.distance / self.duration.total_seconds() * 3.6
class Tracks(object):
__distance = dict()
__duration = dict()
__avg_speed = dict()
__tracks = list()
__files = list()
def __init__(self, logger):
self.logger = logger
def add(self, filename):
if filename not in self.__files:
self.logger.info("Adding file %s.", filename)
with open(filename, 'r') as f:
2020-10-12 15:53:16 +00:00
try:
self.__files.append(filename)
gpx = gpxpy.parse(f)
for raw in gpx.tracks:
track = Track(raw)
self.__tracks.append(track)
trk_month = track.start_time.month
trk_year = track.start_time.year
2020-10-12 15:53:16 +00:00
if trk_year not in self.__distance:
self.__distance[trk_year] = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0}
self.__distance[trk_year][trk_month] += track.distance / 1000
2020-10-12 15:53:16 +00:00
if trk_year not in self.__duration:
self.__duration[trk_year] = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0}
self.__duration[trk_year][trk_month] += track.duration.total_seconds()
2020-10-12 15:53:16 +00:00
if trk_year not in self.__avg_speed:
self.__avg_speed[trk_year] = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0}
self.__avg_speed[trk_year][trk_month] = self.__distance[trk_year][trk_month] / (self.__duration[trk_year][trk_month] / 3600)
self.logger.info("Adding done.")
except Exception as exception:
# TODO: Add logging mechanism.
pass
def years(self):
ret = None
try:
ret = sorted(self.__distance.keys())
except Exception:
pass
return ret
def distances(self, year):
ret = 0
try:
ret = self.__distance[year].values()
except Exception:
pass
return ret
def avg_speeds(self, year):
ret = None
try:
ret = self.__avg_speed[year].values()
except Exception:
pass
return ret
def tracks(self, start_date, end_date):
tracks = list()
dates = pd.date_range(start_date.date(), end_date.date())
for track in self.__tracks:
if track.start_time.date() in dates.date:
tracks.append(track)
return tracks