#!/usr/bin/python import sys import math import xml.dom.minidom class AppInfo(object): def __init__(self): self.infilename = None def usageExit(): sys.stderr.write("usage: gpxlen infile\n") sys.exit(1) def parseCommandLine(argv): ai = AppInfo() argv.pop(0) while len(argv) > 0: if ai.infilename == None: ai.infilename = argv[0] else: usageExit() argv.pop(0) if ai.infilename == None: usageExit() return ai def getSegmentLength(segmentNode): t = 0.0 oldLat = None oldLon = None for pt in segmentNode.getElementsByTagName("trkpt"): lat = float(pt.getAttribute("lat")) * math.pi/180.0 lon = float(pt.getAttribute("lon")) * math.pi/180.0 if oldLat != None: #t += math.acos( # math.cos(lat) * math.cos(lon) * math.cos(oldLat) * math.cos(oldLon) + # math.cos(lat) * math.sin(lon) * math.cos(oldLat) * math.sin(oldLon) + # math.sin(lat) * math.sin(oldLat) #) * 6378100.0 cosa = (math.sin(lat) * math.sin(oldLat) + math.cos(lat) * math.cos(oldLat) * math.cos(oldLon - lon)) if cosa > 1.0: cosa = 1.0 t += math.acos(cosa) * 6378100.0 oldLat = lat oldLon = lon return t def getTrackLength(trackNode): t = 0.0 for seg in trackNode.getElementsByTagName("trkseg"): t = t + getSegmentLength(seg) return t def main(argv): ai = parseCommandLine(argv) dom = xml.dom.minidom.parse(ai.infilename) gpxNode = dom.firstChild for track in gpxNode.getElementsByTagName("trk"): nameNode = track.getElementsByTagName("name") if nameNode != None: name = nameNode[0].firstChild.data else: name = "" sys.stdout.write("Track: %s, " % name) sys.stdout.write("length: %.3f\n" % getTrackLength(track)) return 0 if __name__ == "__main__": sys.exit(main(sys.argv))