From fb961aca4e2b5d569d7e0b0f44ee1cac61ffffca Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Wed, 29 Jan 2020 14:45:34 -0800 Subject: [PATCH 1/7] Add rogue run finder --- .gitignore | 2 ++ draw.py | 7 ++++--- rougue.py | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100755 rougue.py diff --git a/.gitignore b/.gitignore index edd980e..baf75a5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ strava *.pyc *.osm *.pkl +.DS_Store +.env diff --git a/draw.py b/draw.py index 30779ac..db99694 100755 --- a/draw.py +++ b/draw.py @@ -15,13 +15,12 @@ import osm # TODO: move to argparse -use_osm = True osm_color = "salmon" osm_line_width = .1 osm_alpha = .5 -def plot(data, background_color, line_width, line_color, line_alpha, dpi, label=0): +def plot(data, background_color, line_width, line_color, line_alpha, dpi, use_osm, label=0): if line_color.startswith("cmap:"): use_cmap = True max_elev = max([max(d["elevs"]) for d in data]) @@ -156,6 +155,8 @@ def add_shared_args(parser): help="if defined only include this activity type") parser.add_argument("--gpx-dir", default="strava", help="directory with gpx files") + parser.add_argument("--use-osm", default=False, action="store_true", + help="overlay heatmap on top of OpenStreetMap") parser = ArgumentParser() @@ -179,7 +180,7 @@ def add_shared_args(parser): args = parser.parse_args() -plot_keys = ["background_color", "line_color", "line_width", "line_alpha", "dpi"] +plot_keys = ["background_color", "line_color", "line_width", "line_alpha", "dpi", "use_osm"] plot_args = {k: getattr(args, k) for k in plot_keys} cache_path = os.path.join(args.gpx_dir, "cache.pkl") diff --git a/rougue.py b/rougue.py new file mode 100755 index 0000000..1252f48 --- /dev/null +++ b/rougue.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +from gpxpy import parse +from math import atan2, cos, radians, sin, sqrt +from glob import glob + + +def distance(origin, destination): + lat1, lon1 = origin + lat2, lon2 = destination + radius = 6371 # km + dlat = radians(lat2-lat1) + dlon = radians(lon2-lon1) + a = sin(dlat/2) * sin(dlat/2) + cos(radians(lat1)) \ + * cos(radians(lat2)) * sin(dlon/2) * sin(dlon/2) + c = 2 * atan2(sqrt(a), sqrt(1-a)) + d = radius * c + return d + + +def disjointed(filename, max_jump=1): + gpx_file = open(filename, 'r') + gpx = parse(gpx_file) + distances = [] + for i in range(len(gpx.tracks[0].segments[0].points)-1): + p1 = gpx.tracks[0].segments[0].points[i] + p2 = gpx.tracks[0].segments[0].points[i+1] + d = distance((p1.latitude, p1.longitude), (p2.latitude, p2.longitude)) + distances.append(d) + return max(distances) > max_jump + + +def main(): + files = glob("strava/*.gpx") + for filename in files: + if disjointed(filename): + print(filename) + + +if __name__ == '__main__': + main() From ffd645d15c79979d821e8fb3c9b684f92ef20614 Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Wed, 29 Jan 2020 18:26:08 -0800 Subject: [PATCH 2/7] more tweaks --- download.py | 19 +++++++++++++++---- rougue.py => rogue.py | 21 +++++++++++++-------- 2 files changed, 28 insertions(+), 12 deletions(-) rename rougue.py => rogue.py (72%) diff --git a/download.py b/download.py index 695d4ad..580c6c1 100755 --- a/download.py +++ b/download.py @@ -14,6 +14,7 @@ activities_url = "https://www.strava.com/athlete/training_activities" gpx_url = "https://www.strava.com/activities/{id}/export_gpx" activity_txt = "activities.txt" +skipped_txt = "activities.txt" def get_activity_ids(sess, current_list=None): @@ -71,10 +72,18 @@ def get_activity_ids(sess, current_list=None): if not os.path.exists(args.output_dir): os.mkdir(args.output_dir) + +old_skipped = [] +skipped_file = os.path.join(args.output_dir, "skipped.txt") +if os.path.exists(skipped_file): + with open(skipped_file, "r") as f: + old_skipped.extend([l.strip() for l in f.readlines()]) + email = input("email> ") password = getpass.getpass("password> ") skipped = [] + with requests.session() as sess: page = sess.get(login_url) html = lxml.html.fromstring(page.text) @@ -97,7 +106,9 @@ def get_activity_ids(sess, current_list=None): for count, identifier in enumerate(activity_ids, 1): if count % 20 == 0: print(f"({count}/{len(activity_ids)})") - + if identifier in old_skipped: + print(">> data doesn't look like gpx, skipping") + continue output = os.path.join(args.output_dir, f"{identifier}.gpx") if not os.path.exists(output): print(f"downloading activity {identifier} to {output}") @@ -115,7 +126,7 @@ def get_activity_ids(sess, current_list=None): print("found an existing gpx file, exiting") sys.exit(0) -fname = os.path.join(args.output_dir, "skipped.txt") -print(f"writing skipped activity list to {fname}") -with open(fname, "w") as f: + +print(f"writing skipped activity list to {skipped_file}") +with open(skipped_file, "a") as f: f.write("\n".join(skipped)) diff --git a/rougue.py b/rogue.py similarity index 72% rename from rougue.py rename to rogue.py index 1252f48..9767f2f 100755 --- a/rougue.py +++ b/rogue.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 +from glob import glob from gpxpy import parse from math import atan2, cos, radians, sin, sqrt -from glob import glob - +import multiprocessing +import os def distance(origin, destination): lat1, lon1 = origin @@ -20,20 +21,24 @@ def distance(origin, destination): def disjointed(filename, max_jump=1): gpx_file = open(filename, 'r') gpx = parse(gpx_file) - distances = [] for i in range(len(gpx.tracks[0].segments[0].points)-1): p1 = gpx.tracks[0].segments[0].points[i] p2 = gpx.tracks[0].segments[0].points[i+1] d = distance((p1.latitude, p1.longitude), (p2.latitude, p2.longitude)) - distances.append(d) - return max(distances) > max_jump + if d > max_jump: + return filename + return None def main(): files = glob("strava/*.gpx") - for filename in files: - if disjointed(filename): - print(filename) + p = multiprocessing.Pool(multiprocessing.cpu_count()) + results = p.map(disjointed, files) + bad = [r for r in results if r] + for b in bad: + if os.path.exists(b): + print(f"deleting {b}") + os.remove(b) if __name__ == '__main__': From e4ee182cd35d20ab6a7feee5714885a2c8eeb918 Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Wed, 29 Jan 2020 20:46:01 -0800 Subject: [PATCH 3/7] tweaks --- download.py | 14 ++++++++++++-- rogue.py | 13 ++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/download.py b/download.py index 580c6c1..d956bc6 100755 --- a/download.py +++ b/download.py @@ -14,7 +14,8 @@ activities_url = "https://www.strava.com/athlete/training_activities" gpx_url = "https://www.strava.com/activities/{id}/export_gpx" activity_txt = "activities.txt" -skipped_txt = "activities.txt" +skipped_txt = "skipped.txt" +rogue_txt = "rogue.txt" def get_activity_ids(sess, current_list=None): @@ -74,11 +75,17 @@ def get_activity_ids(sess, current_list=None): old_skipped = [] -skipped_file = os.path.join(args.output_dir, "skipped.txt") +skipped_file = os.path.join(args.output_dir, skipped_txt) if os.path.exists(skipped_file): with open(skipped_file, "r") as f: old_skipped.extend([l.strip() for l in f.readlines()]) +rogue = [] +rogue_file = os.path.join(args.output_dir, rogue_txt) +if os.path.exists(rogue_file): + with open(rogue_file, "r") as f: + rogue.extend([l.strip() for l in f.readlines()]) + email = input("email> ") password = getpass.getpass("password> ") @@ -109,6 +116,9 @@ def get_activity_ids(sess, current_list=None): if identifier in old_skipped: print(">> data doesn't look like gpx, skipping") continue + if identifier in rogue: + print(">>> data is rogue, skipping") + continue output = os.path.join(args.output_dir, f"{identifier}.gpx") if not os.path.exists(output): print(f"downloading activity {identifier} to {output}") diff --git a/rogue.py b/rogue.py index 9767f2f..25e71bb 100755 --- a/rogue.py +++ b/rogue.py @@ -35,11 +35,14 @@ def main(): p = multiprocessing.Pool(multiprocessing.cpu_count()) results = p.map(disjointed, files) bad = [r for r in results if r] - for b in bad: - if os.path.exists(b): - print(f"deleting {b}") - os.remove(b) - + if len(bad) > 0: + with open("strava/rogue.txt", "a") as f: + for b in bad: + print(f"deleting {b}") + os.remove(b) + i = b.split(".")[0].split("/")[1] + f.write(f"\n{i}") + os.remove("strava/cache.pkl") if __name__ == '__main__': main() From f9abe72ccf741f2afe05e0ec880603f971c68ae5 Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Wed, 29 Jan 2020 20:59:40 -0800 Subject: [PATCH 4/7] min_samples --- draw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draw.py b/draw.py index db99694..fb3faa0 100755 --- a/draw.py +++ b/draw.py @@ -217,7 +217,7 @@ def add_shared_args(parser): coords = np.array([[np.average(d["lats"][0]), np.average(d["lons"][0])] for d in data]) if args.type == "cluster": - cluster = DBSCAN(eps=args.radius, min_samples=10) + cluster = DBSCAN(eps=args.radius, min_samples=args.min_cluster_size) cluster.fit(coords) n_clusters = np.max(cluster.labels_) + 1 centroids = [np.mean(coords[cluster.labels_ == l], axis=0) for l in range(n_clusters)] From e1a365084bf0b6ceba28026a982541c479cf79b6 Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Mon, 3 Feb 2020 15:40:18 -0800 Subject: [PATCH 5/7] more tweaks --- heatmap/__init__.py | 0 download.py => heatmap/download.py | 0 draw.py => heatmap/draw.py | 22 ++--- osm.py => heatmap/osm.py | 0 heatmap/rogue.py | 78 +++++++++++++++++ rogue.py | 48 ---------- tests/__init__.py | 0 tests/test_rogue.py | 136 +++++++++++++++++++++++++++++ 8 files changed, 225 insertions(+), 59 deletions(-) create mode 100644 heatmap/__init__.py rename download.py => heatmap/download.py (100%) rename draw.py => heatmap/draw.py (94%) rename osm.py => heatmap/osm.py (100%) create mode 100755 heatmap/rogue.py delete mode 100755 rogue.py create mode 100644 tests/__init__.py create mode 100644 tests/test_rogue.py diff --git a/heatmap/__init__.py b/heatmap/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/download.py b/heatmap/download.py similarity index 100% rename from download.py rename to heatmap/download.py diff --git a/draw.py b/heatmap/draw.py similarity index 94% rename from draw.py rename to heatmap/draw.py index fb3faa0..f45a965 100755 --- a/draw.py +++ b/heatmap/draw.py @@ -114,17 +114,16 @@ def load_gpx(files, data=None): gpx = gpxpy.parse(f) track = gpx.tracks[0] - segment = track.segments[0] - - data["tracks"].append({ - "lats": np.array([p.latitude for p in segment.points]), - "lons": np.array([p.longitude for p in segment.points]), - "elevs": np.array([p.elevation for p in segment.points]), - "type": int(track.type), - "name": track.name, - "date": gpx.time, - "filename": os.path.basename(path) - }) + for segment in track.segments: + data["tracks"].append({ + "lats": np.array([p.latitude for p in segment.points]), + "lons": np.array([p.longitude for p in segment.points]), + "elevs": np.array([p.elevation for p in segment.points]), + "type": int(track.type), + "name": track.name, + "date": gpx.time, + "filename": os.path.basename(path) + }) print(f"loaded {len(data)} file(s)") file_set = set(os.path.basename(f) for f in files) if "files" in data: @@ -211,6 +210,7 @@ def add_shared_args(parser): if args.reduction == "average": coords = np.array([[np.average(d["lats"]), np.average(d["lons"])] for d in data]) + print(coords) elif args.reduction == "start_stop_average": coords = np.array([[np.average(d["lats"][[0, -1]]), np.average(d["lons"][[0, -1]])] for d in data]) elif args.reduction == "start": diff --git a/osm.py b/heatmap/osm.py similarity index 100% rename from osm.py rename to heatmap/osm.py diff --git a/heatmap/rogue.py b/heatmap/rogue.py new file mode 100755 index 0000000..cc6c40c --- /dev/null +++ b/heatmap/rogue.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +from gpxpy import parse +from gpxpy.gpx import GPXTrackSegment +from math import atan2, cos, radians, sin, sqrt +from glob import glob +import os +import multiprocessing + + +def break_segment(segment, break_points): + new = [segment] + if len(break_points) != 0: + i = 0 + for b in break_points: + old = new.pop() + new1, new2 = old.split(b-i) + if len(new1.points) != 0: + new.append(new1) + assert(len(new2.points) != 0) + new.append(new2) + i += b + return new + + +def find_breaks(segment, max_dist): + breaks = [] + for i in range(len(segment.points)-1): + if distance(segment.points[i+1], segment.points[i]) > max_dist: + breaks.append(i) + return breaks + + +def fix_segments(segments, max_dist): + s = [] + for segment in segments: + s.extend(break_segment(segment, find_breaks(segment, max_dist))) + return s + + +def distance(origin, destination): + lat1, lon1 = origin.latitude, origin.longitude + lat2, lon2 = destination.latitude, destination.longitude + radius = 6371 # km + dlat = radians(lat2-lat1) + dlon = radians(lon2-lon1) + a = sin(dlat/2) * sin(dlat/2) + cos(radians(lat1)) \ + * cos(radians(lat2)) * sin(dlon/2) * sin(dlon/2) + c = 2 * atan2(sqrt(a), sqrt(1-a)) + d = radius * c + return d + + +def disjointed(filename): + with open(filename, 'r') as f: + gpx = parse(f) + old_segments = gpx.tracks[0].segments + new_segments = fix_segments(old_segments, 0.01) + if len(old_segments) == len(new_segments): + return None + gpx.tracks[0].segments = new_segments + with open(filename, 'w') as f: + f.write(gpx.to_xml()) + return filename + + +def main(): + files = glob("strava/*.gpx") + p = multiprocessing.Pool(multiprocessing.cpu_count()) + results = p.map(disjointed, files) + bad = [r for r in results if r] + if len(bad) > 0: + if os.path.isfile("strava/cache.pkl"): + os.remove("strava/cache.pkl") + print(bad) + + +if __name__ == '__main__': + main() diff --git a/rogue.py b/rogue.py deleted file mode 100755 index 25e71bb..0000000 --- a/rogue.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python3 -from glob import glob -from gpxpy import parse -from math import atan2, cos, radians, sin, sqrt -import multiprocessing -import os - -def distance(origin, destination): - lat1, lon1 = origin - lat2, lon2 = destination - radius = 6371 # km - dlat = radians(lat2-lat1) - dlon = radians(lon2-lon1) - a = sin(dlat/2) * sin(dlat/2) + cos(radians(lat1)) \ - * cos(radians(lat2)) * sin(dlon/2) * sin(dlon/2) - c = 2 * atan2(sqrt(a), sqrt(1-a)) - d = radius * c - return d - - -def disjointed(filename, max_jump=1): - gpx_file = open(filename, 'r') - gpx = parse(gpx_file) - for i in range(len(gpx.tracks[0].segments[0].points)-1): - p1 = gpx.tracks[0].segments[0].points[i] - p2 = gpx.tracks[0].segments[0].points[i+1] - d = distance((p1.latitude, p1.longitude), (p2.latitude, p2.longitude)) - if d > max_jump: - return filename - return None - - -def main(): - files = glob("strava/*.gpx") - p = multiprocessing.Pool(multiprocessing.cpu_count()) - results = p.map(disjointed, files) - bad = [r for r in results if r] - if len(bad) > 0: - with open("strava/rogue.txt", "a") as f: - for b in bad: - print(f"deleting {b}") - os.remove(b) - i = b.split(".")[0].split("/")[1] - f.write(f"\n{i}") - os.remove("strava/cache.pkl") - -if __name__ == '__main__': - main() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_rogue.py b/tests/test_rogue.py new file mode 100644 index 0000000..b9d0b76 --- /dev/null +++ b/tests/test_rogue.py @@ -0,0 +1,136 @@ +from heatmap import rogue +import unittest +from unittest.mock import patch, MagicMock +from gpxpy.gpx import GPXTrackPoint, GPXTrackSegment +from typing import Any, List + + +def fake_distance(p1, p2): + return abs(p2.latitude - p1.latitude) + + +def generate_segment(lats): + points = [GPXTrackPoint(latitude=x) for x in lats] + return GPXTrackSegment(points=points) + + +# This is dumb +def equals(object1: Any, object2: Any, ignore: Any=None) -> bool: + """ Testing purposes only """ + + if not object1 and not object2: + return True + + if not object1 or not object2: + print('Not obj2') + return False + + if not object1.__class__ == object2.__class__: + print('Not obj1') + return False + + if type(object1) == type(object2) == type([]): + if len(object1) != len(object2): + return False + for i in range(len(object1)): + if not equals(object1[i], object2[i]): + return False + return True + + attributes: List[str] = [] + for attr in dir(object1): + if not ignore or attr not in ignore: + if not hasattr(object1, '__call__') and not attr.startswith('_'): + if attr not in attributes: + attributes.append(attr) + + for attr in attributes: + attr1 = getattr(object1, attr) + attr2 = getattr(object2, attr) + + if attr1 == attr2: + return True + + if not attr1 and not attr2: + return True + if not attr1 or not attr2: + print(f'Object differs in attribute {attr} ({attr1} - {attr2})') + return False + + if not equals(attr1, attr2): + print(f'Object differs in attribute {attr} ({attr1} - {attr2})') + return False + + return True + + +class TestBreaks(unittest.TestCase): + + def test_break_segment_with_1_element(self): + lats = [1] + segment = generate_segment(lats) + result = rogue.break_segment(segment, []) + self.assertEqual(result, [segment]) + + def test_break_segment_with_2_elements_no_breaks(self): + lats = [1, 2] + segment = generate_segment(lats) + result = rogue.break_segment(segment, []) + self.assertEqual(result, [segment]) + + def test_break_segment_with_2_elements_1_break(self): + lats = [1, 3] + segment = generate_segment(lats) + result = rogue.break_segment(segment, [0]) + correct = [generate_segment([1]), generate_segment([3])] + self.assertTrue(equals(result, correct)) + + @patch('heatmap.rogue.distance', MagicMock(side_effect=fake_distance)) + def test_find_breaks_with_1_span(self): + lats = [1, 2, 3, 4, 5] + segment = generate_segment(lats) + result = rogue.find_breaks(segment, 1) + self.assertEqual(result, []) + + @patch('heatmap.rogue.distance', MagicMock(side_effect=fake_distance)) + def test_find_breaks_with_2_spans(self): + lats = [1, 2, 3, 5, 6, 7] + segment = generate_segment(lats) + result = rogue.find_breaks(segment, 1) + self.assertEqual(result, [2]) + + @patch('heatmap.rogue.distance', MagicMock(side_effect=fake_distance)) + def test_find_breaks_with_3_spans(self): + lats = [1, 2, 3, 5, 6, 7, 9, 10, 11] + segment = generate_segment(lats) + result = rogue.find_breaks(segment, 1) + self.assertEqual(result, [2, 5]) + + @patch('heatmap.rogue.distance', MagicMock(side_effect=fake_distance)) + def test_fix_segments_with_1_span(self): + lats = [1, 2, 3, 4, 5] + segment = generate_segment(lats) + result = rogue.fix_segments([segment], 1) + self.assertTrue(equals(result, [segment])) + + @patch('heatmap.rogue.distance', MagicMock(side_effect=fake_distance)) + def test_fix_segments_with_2_spans(self): + lats = [1, 2, 3, 5, 6, 7] + segment = generate_segment(lats) + result = rogue.fix_segments([segment], 1) + correct = [generate_segment([1, 2, 3]), generate_segment([5, 6, 7])] + self.assertTrue(equals(result, correct)) + + @patch('heatmap.rogue.distance', MagicMock(side_effect=fake_distance)) + def test_fix_segments_with_3_spans(self): + lats = [1, 2, 3, 5, 6, 7, 9, 10, 11] + segment = generate_segment(lats) + result = rogue.fix_segments([segment], 1) + correct = [generate_segment([1, 2, 3]), + generate_segment([5, 6, 7]), + generate_segment([9, 10, 11])] + self.assertTrue(equals(result, correct)) + + +if __name__ == "__main__": + unittest.main() From df2891321d1de87e951faf9f87d8c7c5a0d8605f Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Mon, 3 Feb 2020 15:44:48 -0800 Subject: [PATCH 6/7] revert download --- heatmap/download.py | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/heatmap/download.py b/heatmap/download.py index d956bc6..695d4ad 100755 --- a/heatmap/download.py +++ b/heatmap/download.py @@ -14,8 +14,6 @@ activities_url = "https://www.strava.com/athlete/training_activities" gpx_url = "https://www.strava.com/activities/{id}/export_gpx" activity_txt = "activities.txt" -skipped_txt = "skipped.txt" -rogue_txt = "rogue.txt" def get_activity_ids(sess, current_list=None): @@ -73,24 +71,10 @@ def get_activity_ids(sess, current_list=None): if not os.path.exists(args.output_dir): os.mkdir(args.output_dir) - -old_skipped = [] -skipped_file = os.path.join(args.output_dir, skipped_txt) -if os.path.exists(skipped_file): - with open(skipped_file, "r") as f: - old_skipped.extend([l.strip() for l in f.readlines()]) - -rogue = [] -rogue_file = os.path.join(args.output_dir, rogue_txt) -if os.path.exists(rogue_file): - with open(rogue_file, "r") as f: - rogue.extend([l.strip() for l in f.readlines()]) - email = input("email> ") password = getpass.getpass("password> ") skipped = [] - with requests.session() as sess: page = sess.get(login_url) html = lxml.html.fromstring(page.text) @@ -113,12 +97,7 @@ def get_activity_ids(sess, current_list=None): for count, identifier in enumerate(activity_ids, 1): if count % 20 == 0: print(f"({count}/{len(activity_ids)})") - if identifier in old_skipped: - print(">> data doesn't look like gpx, skipping") - continue - if identifier in rogue: - print(">>> data is rogue, skipping") - continue + output = os.path.join(args.output_dir, f"{identifier}.gpx") if not os.path.exists(output): print(f"downloading activity {identifier} to {output}") @@ -136,7 +115,7 @@ def get_activity_ids(sess, current_list=None): print("found an existing gpx file, exiting") sys.exit(0) - -print(f"writing skipped activity list to {skipped_file}") -with open(skipped_file, "a") as f: +fname = os.path.join(args.output_dir, "skipped.txt") +print(f"writing skipped activity list to {fname}") +with open(fname, "w") as f: f.write("\n".join(skipped)) From 155eb2ff50fa17ceb6350b9cef09d54d86715c44 Mon Sep 17 00:00:00 2001 From: Douglas Jordan Date: Mon, 3 Feb 2020 15:59:08 -0800 Subject: [PATCH 7/7] tweaks --- heatmap/draw.py | 1 - heatmap/rogue.py | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/heatmap/draw.py b/heatmap/draw.py index f45a965..bfd008e 100755 --- a/heatmap/draw.py +++ b/heatmap/draw.py @@ -210,7 +210,6 @@ def add_shared_args(parser): if args.reduction == "average": coords = np.array([[np.average(d["lats"]), np.average(d["lons"])] for d in data]) - print(coords) elif args.reduction == "start_stop_average": coords = np.array([[np.average(d["lats"][[0, -1]]), np.average(d["lons"][[0, -1]])] for d in data]) elif args.reduction == "start": diff --git a/heatmap/rogue.py b/heatmap/rogue.py index cc6c40c..060c11d 100755 --- a/heatmap/rogue.py +++ b/heatmap/rogue.py @@ -16,7 +16,8 @@ def break_segment(segment, break_points): new1, new2 = old.split(b-i) if len(new1.points) != 0: new.append(new1) - assert(len(new2.points) != 0) + if len(new2.points) == 0: + return new new.append(new2) i += b return new @@ -54,7 +55,7 @@ def disjointed(filename): with open(filename, 'r') as f: gpx = parse(f) old_segments = gpx.tracks[0].segments - new_segments = fix_segments(old_segments, 0.01) + new_segments = fix_segments(old_segments, 0.1) if len(old_segments) == len(new_segments): return None gpx.tracks[0].segments = new_segments