예제 #1
0
def main(argv):
    parser = OptionParser(description='olc2002 to GPX converter')
    parser.add_option('-l', '--league', metavar='STRING')
    parser.add_option('-o', '--output', metavar='FILENAME')
    parser.add_option('--debug', action='store_true')
    parser.set_defaults(debug=False)
    parser.set_defaults(league='OLC')
    options, args = parser.parse_args(argv)
    #
    routes = []
    date = None
    for line in fileinput.input(args[1:]):
        line = line.rstrip()
        m = DEBUG_DATE_RE.match(line)
        if m:
            day, mon, year = map(int, m.groups())
            date = datetime.date(year + 2000, mon, day)
            continue
        m = OUT_TYPE_RE.match(line)
        if m:
            name = PRETTY_NAME[m.group(1)]
            circuit = m.group(1) in CIRCUITS
            route = Route(name, options.league, None, None, None, circuit, [])
            routes.append(route)
            last_time = None
            continue
        m = OUT_FLIGHT_KM_RE.match(line)
        if m:
            route.distance = float(m.group(1))
            continue
        m = OUT_FLIGHT_POINTS_RE.match(line)
        if m:
            route.score = float(m.group(1))
            route.multiplier = route.score / route.distance
            continue
        m = OUT_P_RE.match(line)
        if m:
            name = 'TP%d' % len(route.tps) if route.tps else 'Start'
            lat = int(m.group(5)) + float(m.group(6)) / 60.0
            if m.group(4) == 'S':
                lat = -lat
            lon = int(m.group(8)) + float(m.group(9)) / 60.0
            if m.group(7) == 'W':
                lon = -lon
            time = datetime.time(*map(int, m.group(1, 2, 3)))
            if not last_time is None and time < last_time:
                date += datetime.timedelta(1)
            dt = datetime.datetime.combine(date, time)
            coord = Coord(lat, lon, 0, dt)
            tp = Turnpoint(name, coord)
            route.tps.append(tp)
            last_time = time
            continue
        if options.debug:
            logging.warning(line)
    for route in routes:
        route.tps[-1].name = 'Finish'
    xc = XC(routes)
    with gpx_tag(TreeBuilder()) as tb:
        element = xc.build_tree(tb).close()
    output = open(options.output, 'w') if options.output else sys.stdout
    output.write('<?xml version="1.0" encoding="UTF-8"?>')
    ElementTree(element).write(output)
예제 #2
0
파일: olc2gpx.py 프로젝트: Iv/igc2kmz
def main(argv):
    parser = OptionParser(description='olc2002 to GPX converter')
    parser.add_option('-l', '--league', metavar='STRING')
    parser.add_option('-o', '--output', metavar='FILENAME')
    parser.add_option('--debug', action='store_true')
    parser.set_defaults(debug=False)
    parser.set_defaults(league='OLC')
    options, args = parser.parse_args(argv)
    #
    routes = []
    date = None
    for line in fileinput.input(args[1:]):
        line = line.rstrip()
        m = DEBUG_DATE_RE.match(line)
        if m:
            day, mon, year = map(int, m.groups())
            date = datetime.date(year + 2000, mon,day)
            continue
        m = OUT_TYPE_RE.match(line)
        if m:
            name = PRETTY_NAME[m.group(1)]
            circuit = m.group(1) in CIRCUITS
            route = Route(name, options.league, None, None, None, circuit, [])
            routes.append(route)
            last_time = None
            continue
        m = OUT_FLIGHT_KM_RE.match(line)
        if m:
            route.distance = float(m.group(1))
            continue
        m = OUT_FLIGHT_POINTS_RE.match(line)
        if m:
            route.score = float(m.group(1))
            route.multiplier = route.score / route.distance
            continue
        m = OUT_P_RE.match(line)
        if m:
            name = 'TP%d' % len(route.tps) if route.tps else 'Start'
            lat = int(m.group(5)) + float(m.group(6)) / 60.0
            if m.group(4) == 'S':
                lat = -lat
            lon = int(m.group(8)) + float(m.group(9)) / 60.0
            if m.group(7) == 'W':
                lon = -lon
            time = datetime.time(*map(int, m.group(1, 2, 3)))
            if not last_time is None and time < last_time:
                date += datetime.timedelta(1)
            dt = datetime.datetime.combine(date, time)
            coord = Coord(lat, lon, 0, dt)
            tp = Turnpoint(name, coord)
            route.tps.append(tp)
            last_time = time
            continue
        if options.debug:
            logging.warning(line)
    for route in routes:
        route.tps[-1].name = 'Finish'
    xc = XC(routes)
    with gpx_tag(TreeBuilder()) as tb:
        element = xc.build_tree(tb).close()
    output = open(options.output, 'w') if options.output else sys.stdout
    output.write('<?xml version="1.0" encoding="UTF-8"?>')
    ElementTree(element).write(output)
예제 #3
0
def main(argv):
    parser = OptionParser(usage='Usage: %prog [options] filename.igc',
                          description='IGC to task converter')
    parser.add_option('-o',
                      '--output',
                      metavar='FILENAME',
                      help='set output filename')
    parser.add_option('-n', '--name', metavar='NAME', help='set task name')
    parser.add_option('-z',
                      '--tz-offset',
                      metavar='HOURS',
                      type='int',
                      help='set timezone offset')
    parser.add_option('--start', metavar='NAME', help='set start turnpoint')
    parser.add_option('--start-count',
                      metavar='NUMBER',
                      type='int',
                      help='set start count')
    parser.add_option('--start-radius',
                      metavar='RADIUS',
                      type='int',
                      help='set start radius in meters')
    parser.add_option('--start-time', metavar='TIME', help='set start time')
    parser.add_option('--ess',
                      metavar='NAME',
                      help='set end of speed section turnpoint')
    parser.add_option('--ess-count',
                      metavar='NUMBER',
                      type='int',
                      help='set end of speed section count')
    parser.add_option('--ess-radius',
                      metavar='RADIUS',
                      type='int',
                      help='set end of speed section radius in meters')
    parser.add_option('--goal', metavar='NAME', help='set goal turnpoint')
    parser.add_option('--goal-count',
                      metavar='NUMBER',
                      type='int',
                      help='set goal count')
    parser.add_option('--goal-radius',
                      metavar='RADIUS',
                      type='int',
                      help='set start radius in meters')
    parser.set_defaults(tz_offset=0)
    parser.set_defaults(start_count=0)
    parser.set_defaults(ess_count=0)
    parser.set_defaults(goal_count=0)
    #
    options, args = parser.parse_args(argv)
    if len(args) < 2:
        parser.error('no IGC file specified')
    if len(args) > 2:
        parser.error('excess arguments on command line: %s' % repr(args[2:]))
    #
    igc = IGC(open(args[1]))
    if not igc.c:
        parser.error('%s does not contain a task' % repr(argv[1]))
    tps = []
    for c in igc.c:
        if c.name == 'TAKEOFF' or c.name == 'LANDING':
            continue
        m = re.match(r'([A-Z][0-9]{2})([0-9]{3})', c.name)
        if m:
            name = m.group(1)
            ele = 10 * int(m.group(2))
        else:
            name = c.name
            ele = 0
        coord = Coord(c.lat, c.lon, ele)
        tp = Turnpoint(name, coord)
        tps.append(tp)
    task = Task(options.name, tps)
    #
    if options.start:
        start = find_nth(lambda tp: tp.name == options.start, task.tps,
                         options.start_count)
        if not start:
            parser.error('start turnpoint %s not found' % repr(options.start))
    else:
        start = task.tps[1]
    if options.start_radius:
        start.radius = int(options.start_radius)
    if options.start_time:
        m = re.match(r'(\d+):(\d\d)\Z', options.start_time)
        if not m:
            parser.error('invalid start time %s' % repr(options.start_time))
        hour, minute = map(int, m.group(1, 2))
        start.coord.dt = igc.b[0].dt.replace(hour=hour,
                                             minute=minute,
                                             second=0) \
                         - timedelta(seconds=3600 * options.tz_offset)
    #
    if options.ess:
        ess = find_nth(lambda tp: tp.name == options.ess, task.tps,
                       options.ess_count)
        if not ess:
            parser.error('end of speed section turnpoint %s not found' %
                         repr(options.ess))
    else:
        ess = task.tps[-2]
    if options.ess_radius:
        ess.radius = int(options.ess_radius)
    #
    if options.goal:
        goal = find_nth(lambda tp: tp.name == options.goal, task.tps,
                        options.goal_count)
        if not goal:
            parser.error('goal turnpoint %s not found' % repr(options.goal))
    else:
        goal = task.tps[-1]
    if options.goal_radius:
        goal.radius = int(options.goal_radius)
    #
    with gpx_tag(TreeBuilder()) as tb:
        element = task.build_tree(tb).close()
    output = open(options.output, 'w') if options.output else sys.stdout
    output.write('<?xml version="1.0" encoding="utf-8"?>\n')
    pretty_write(output, element)
예제 #4
0
파일: igc2task.py 프로젝트: Iv/igc2kmz
def main(argv):
    parser = OptionParser(
            usage='Usage: %prog [options] filename.igc',
            description='IGC to task converter')
    parser.add_option('-o', '--output', metavar='FILENAME',
                      help='set output filename')
    parser.add_option('-n', '--name', metavar='NAME',
                      help='set task name')
    parser.add_option('-z', '--tz-offset', metavar='HOURS', type='int',
                      help='set timezone offset')
    parser.add_option('--start', metavar='NAME',
                      help='set start turnpoint')
    parser.add_option('--start-count', metavar='NUMBER', type='int',
                      help='set start count')
    parser.add_option('--start-radius', metavar='RADIUS', type='int',
                      help='set start radius in meters')
    parser.add_option('--start-time', metavar='TIME',
                      help='set start time')
    parser.add_option('--ess', metavar='NAME',
                      help='set end of speed section turnpoint')
    parser.add_option('--ess-count', metavar='NUMBER', type='int',
                      help='set end of speed section count')
    parser.add_option('--ess-radius', metavar='RADIUS', type='int',
                      help='set end of speed section radius in meters')
    parser.add_option('--goal', metavar='NAME',
                      help='set goal turnpoint')
    parser.add_option('--goal-count', metavar='NUMBER', type='int',
                      help='set goal count')
    parser.add_option('--goal-radius', metavar='RADIUS', type='int',
                      help='set start radius in meters')
    parser.set_defaults(tz_offset=0)
    parser.set_defaults(start_count=0)
    parser.set_defaults(ess_count=0)
    parser.set_defaults(goal_count=0)
    #
    options, args = parser.parse_args(argv)
    if len(args) < 2:
        parser.error('no IGC file specified')
    if len(args) > 2:
        parser.error('excess arguments on command line: %s' % repr(args[2:]))
    #
    igc = IGC(open(args[1]))
    if not igc.c:
        parser.error('%s does not contain a task' % repr(argv[1]))
    tps = []
    for c in igc.c:
        if c.name == 'TAKEOFF' or c.name == 'LANDING':
            continue
        m = re.match(r'([A-Z][0-9]{2})([0-9]{3})', c.name)
        if m:
            name = m.group(1)
            ele = 10 * int(m.group(2))
        else:
            name = c.name
            ele = 0
        coord = Coord(c.lat, c.lon, ele)
        tp = Turnpoint(name, coord)
        tps.append(tp)
    task = Task(options.name, tps)
    #
    if options.start:
        start = find_nth(lambda tp: tp.name == options.start, task.tps,
                         options.start_count)
        if not start:
            parser.error('start turnpoint %s not found' % repr(options.start))
    else:
        start = task.tps[1]
    if options.start_radius:
        start.radius = int(options.start_radius)
    if options.start_time:
        m = re.match(r'(\d+):(\d\d)\Z', options.start_time)
        if not m:
            parser.error('invalid start time %s' % repr(options.start_time))
        hour, minute = map(int, m.group(1, 2))
        start.coord.dt = igc.b[0].dt.replace(hour=hour,
                                             minute=minute,
                                             second=0) \
                         - timedelta(seconds=3600 * options.tz_offset)
    #
    if options.ess:
        ess = find_nth(lambda tp: tp.name == options.ess, task.tps,
                       options.ess_count)
        if not ess:
            parser.error('end of speed section turnpoint %s not found'
                         % repr(options.ess))
    else:
        ess = task.tps[-2]
    if options.ess_radius:
        ess.radius = int(options.ess_radius)
    #
    if options.goal:
        goal = find_nth(lambda tp: tp.name == options.goal, task.tps,
                        options.goal_count)
        if not goal:
            parser.error('goal turnpoint %s not found' % repr(options.goal))
    else:
        goal = task.tps[-1]
    if options.goal_radius:
        goal.radius = int(options.goal_radius)
    #
    with gpx_tag(TreeBuilder()) as tb:
        element = task.build_tree(tb).close()
    output = open(options.output, 'w') if options.output else sys.stdout
    output.write('<?xml version="1.0" encoding="utf-8"?>\n')
    pretty_write(output, element)