Skip to content

Instantly share code, notes, and snippets.

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 vigorouscoding/f5abeedd3c17fa6eb9f47602890245e9 to your computer and use it in GitHub Desktop.
Save vigorouscoding/f5abeedd3c17fa6eb9f47602890245e9 to your computer and use it in GitHub Desktop.
Parse a GPX file and add extra locations by interpolation. This allows you to slow down a simulated route in Xcode/iOS Simulator.
#!/usr/bin/python
# Interpolate GPX waypoints to slow a simulated route down.
import itertools
import sys
import xml.etree.ElementTree as ET
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
def add_points(tree, count):
root = tree.getroot()
newroot = ET.Element('gpx')
for c0, c1 in pairwise(root):
c0lat = float(c0.attrib["lat"])
c1lat = float(c1.attrib["lat"])
c0lon = float(c0.attrib["lon"])
c1lon = float(c1.attrib["lon"])
latdiff = c1lat - c0lat
londiff = c1lon - c0lon
latstep = latdiff / (count + 1)
lonstep = londiff / (count + 1)
ET.SubElement(newroot, "wpt", c0.attrib)
for i in range(1, count + 1):
sublat = c0lat + (i * latstep)
sublon = c0lon + (i * lonstep)
subelem = ET.SubElement(newroot, "wpt", { "lat": str(sublat), "lon": str(sublon) })
ET.SubElement(newroot, "wpt", root[-1].attrib)
newtree = ET.ElementTree(newroot)
newtree.write(sys.stdout)
if __name__ == '__main__':
# args: filename, additional point count
tree = ET.parse(sys.argv[1])
add_points(tree, int(sys.argv[2]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment