Skip to content

Instantly share code, notes, and snippets.

@loganwilliams
Last active October 18, 2017 18:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save loganwilliams/ea8501e208dea78784e9df8673dd5bfd to your computer and use it in GitHub Desktop.
Save loganwilliams/ea8501e208dea78784e9df8673dd5bfd to your computer and use it in GitHub Desktop.
import gpxpy
import gpxpy.gpx
import geopy.distance
from geographiclib.geodesic import Geodesic
import copy
gpxfile = open('path/to/gpx_file.gpx','r')
gpx = gpxpy.parse(gpxfile)
def get_distance(point1, point2):
return geopy.distance.vincenty(point1, point2).m
def get_bearing(point1, point2):
return Geodesic.WGS84.Inverse(point1[0], point1[1], point2[0], point2[1])['azi1']
def get_point(point1, bearing, distance):
origin = geopy.Point(point1[0], point1[1])
destination = geopy.distance.vincenty(meters=distance).destination(point1, bearing)
return (destination.latitude, destination.longitude)
dists = []
headings = []
for i in range(1, len(gpx.tracks[0].segments[0].points)):
dist = get_distance((gpx.tracks[0].segments[0].points[i-1].latitude, gpx.tracks[0].segments[0].points[i-1].longitude), (gpx.tracks[0].segments[0].points[i].latitude, gpx.tracks[0].segments[0].points[i].longitude))
heading = get_bearing((gpx.tracks[0].segments[0].points[i-1].latitude, gpx.tracks[0].segments[0].points[i-1].longitude), (gpx.tracks[0].segments[0].points[i].latitude, gpx.tracks[0].segments[0].points[i].longitude))
dists.append(dist)
headings.append(heading)
interpolated_points = [[gpx.tracks[0].segments[0].points[0].latitude, gpx.tracks[0].segments[0].points[0].longitude]]
interpolated_headings = [headings[0]]
step_distance = 0
step = 0
for i in range(len(dists)):
want_to_move = 10
intermediate_point = (interpolated_points[i][0], interpolated_points[i][1])
while (want_to_move + step_distance) > dists[step]:
left_to_move = dists[step] - step_distance
intermediate_point = get_point(intermediate_point, headings[step], left_to_move)
want_to_move -= left_to_move
step_distance = 0
step += 1
new_point = get_point(intermediate_point, headings[step], want_to_move)
interpolated_headings.append(headings[step])
step_distance += want_to_move
interpolated_points.append(new_point)
print(interpolated_points)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment