From 506ce1464944097b88b16bedf483cc0996c7f4b2 Mon Sep 17 00:00:00 2001 From: Robbie Nesmith Date: Mon, 27 May 2024 10:06:26 -0500 Subject: [PATCH] Add option to split file by tracks --- gpxtools/gpxsplitter.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/gpxtools/gpxsplitter.py b/gpxtools/gpxsplitter.py index fd60783..4096414 100644 --- a/gpxtools/gpxsplitter.py +++ b/gpxtools/gpxsplitter.py @@ -18,10 +18,25 @@ def need_split_by_days(t1: datetime.datetime, t2: datetime.datetime, seconds: in def need_split_by_time_interval(t1: datetime.datetime, t2: datetime.datetime, seconds: int) -> bool: return abs((t2 - t1).total_seconds()) > seconds +def split_file_by_tracks(gpx_filename: str, gpx_data: gpxpy.GPX) -> None: + gpx_template = gpx_data.clone() + gpx_template.tracks.clear() + for track_index in range(len(gpx_data.tracks)): + track = gpx_data.tracks[track_index] + gpx_clone = gpx_template.clone() + gpx_clone.tracks.append(track) + file_prefix = str(track_index) + if track.name: + file_prefix = track.name + fn = common.prefix_filename(gpx_filename, file_prefix) + with open(fn, "w") as f: + f.write(gpx_clone.to_xml()) + print(f"Saved {fn}") + def save_gpx(gpg: gpxpy.GPX) -> None: pass -def process(gpx_file: str, split_by_days: bool, time_interval: str) -> None: +def process(gpx_file: str, split_by_days: bool, time_interval: str, split_tracks: bool) -> None: print(f"Opening {gpx_file}") with open(gpx_file) as f: gpx = gpx_parser.parse(f) @@ -33,6 +48,9 @@ def process(gpx_file: str, split_by_days: bool, time_interval: str) -> None: elif time_interval: split_func = need_split_by_time_interval interval = common.parse_duration(time_interval) + elif split_tracks: + split_file_by_tracks(gpx_file, gpx) + return else: print("Specify way to split GPX file") sys.exit(1) @@ -84,12 +102,14 @@ def main() -> None: parser = argparse.ArgumentParser(description='Split GPX file') parser.add_argument('-d', '--days', action='store_true', default=False, help='Split multi-day track into single day tracks') parser.add_argument('-t', '--time', type=str, default="", help='Split by time intervals (for exampe 1m, 2s, 3h)') + parser.add_argument('-r', '--tracks', action='store_true', default=False, help='Split tracks into individual files') parser.add_argument('gpx_files', metavar='gpx', type=str, default='', nargs='*', help='GPX file') args = parser.parse_args() gpx_files = args.gpx_files split_by_days = args.days time_interval = args.time + split_tracks = args.tracks for gpx_file in gpx_files: - process(gpx_file, split_by_days = split_by_days, time_interval=time_interval) \ No newline at end of file + process(gpx_file, split_by_days = split_by_days, time_interval=time_interval, split_tracks=split_tracks) \ No newline at end of file