update = s.data._asdict() try: augment(fix, update) except AssertionError as e: if 'time' not in str(e): logging.warn("Unusual split at line %u. (%s)", line_number, e) if 'time' not in fix and 'time' in state: fix['time'] = state['time'] if 'date' not in fix and 'date' in state: fix['date'] = state['date'] if fix['time'] >= state['time'] else (datetime.strptime(state['date'], "%d%m%y") + timedelta(days=1)).strftime("%d%m%y") fixes.append(fix) fix = update if 'date' in update: state['date'] = update['date'] if 'time' in update: state['time'] = update['time'] if fix: fixes.append(fix) segment, prev_time, seg_number = [], None, 0 for loc in (extract(fix) for fix in fixes): if 'time' not in loc: continue if prev_time and loc['time'] > prev_time + timedelta(seconds=15): upload_points(file, seg_number, segment) segment = [] seg_number += 1 segment.append(loc) prev_time = loc['time'] loc['time'] = loc['time'].isoformat() + 'Z' if segment: upload_points(file, seg_number, segment)
import sys from xml.etree import ElementTree as ET import logging from helpers import upload_points files = sys.argv[1:] for file in files: logging.info("Reading %s", file) tree = ET.parse(file) seg_number = 0 for seg in tree.findall(".//{http://www.topografix.com/GPX/1/1}trkseg"): points = [] for pt in seg.findall("{http://www.topografix.com/GPX/1/1}trkpt"): point = { 'lat': float(pt.attrib['lat']), 'lon': float(pt.attrib['lon']) } ele = pt.find('{http://www.topografix.com/GPX/1/1}ele') if ele is not None: point['ele'] = float(ele.text) time = pt.find('{http://www.topografix.com/GPX/1/1}time') if time is not None: point['time'] = time.text points.append(point) upload_points(file, seg_number, points) seg_number += 1