#!/usr/bin/env python
import gpxpy
from math import radians, cos, sin, asin, sqrt, atan2, degrees, pi, floor
def haversine(lon1, lat1, lon2, lat2):
dlon = radians(lon2 - lon1)
dlat = radians(lat2 - lat1)
a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
c = 2 * asin(sqrt(a))
r_earth = 6372.8
return c * r_earth
def bearing(lon1, lat1, lon2, lat2):
bearing = atan2(
sin(lon2 - lon1) * cos(lat2),
cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1),
)
return (round(degrees(bearing)) + 360) % 360
if __name__ == "__main__":
with open("example.gpx", "r") as gpx_file:
gpx = gpxpy.parse(gpx_file)
distance_per_degree = [0] * 360
for track in gpx.tracks:
for segment in track.segments:
for prev, cur in zip(segment.points, segment.points[1:]):
distance = haversine(prev.longitude, prev.latitude, cur.longitude, cur.latitude)
bearing_degree = bearing(prev.longitude, prev.latitude, cur.longitude, cur.latitude)
distance_per_degree[bearing_degree] += distance
print(distance_per_degree)