diff --git a/bin/leonardo2kmz.py b/bin/leonardo2kmz.py index 8affc50..44f54d1 100755 --- a/bin/leonardo2kmz.py +++ b/bin/leonardo2kmz.py @@ -16,8 +16,10 @@ # along with this program. If not, see . +import datetime import optparse import os.path +import re import sys from urlparse import urljoin @@ -29,6 +31,21 @@ from igc2kmz import flights2kmz, Flight from igc2kmz.igc import IGC import igc2kmz.kml as kml from igc2kmz.photo import Photo +from igc2kmz.xc import Coord, Route, Turnpoint, XC + + +DEFAULT_NAME = 'Leonardo' +DEFAULT_URL = 'http://localhost/phpbb2-leonardo/' +DEFAULT_ICON = 'modules/leonardo/templates/basic/tpl/leonardo_logo.gif' +DEFAULT_DIRECTORY = '/home/twp/src/phpbb2-leonardo' +DEFAULT_ENGINE = 'mysql://phpbb2:VDuURtNK02Nb@localhost/phpbb2' + +LEAGUE = (None, 'OLC', 'FAI') +NAME = (None, 'free flight', 'free triangle', 'FAI triangle', 'free flight (no turnpoints)', 'maximum distance from take-off') +CIRCUIT = (None, False, True, True, False, False) + +B_RECORD_RE = re.compile(r'B(\d{2})(\d{2})(\d{2})' + r'(\d{2})(\d{5})([NS])(\d{3})(\d{5})([EW])') def main(argv): @@ -45,23 +62,23 @@ def main(argv): parser.add_option('--debug', action='store_true', help='enable pretty KML output') parser.set_defaults(output='igc2kmz.kmz') - parser.set_defaults(name='Leonardo') - parser.set_defaults(icon='http://www.paraglidingforum.com/modules/leonardo/templates/basic/tpl/leonardo_logo.gif') - parser.set_defaults(url='http://localhost/phpbb2-leonardo/') - parser.set_defaults(directory='/home/twp/src/phpbb2-leonardo') - parser.set_defaults(engine='mysql://phpbb2:VDuURtNK02Nb@localhost/phpbb2') + parser.set_defaults(name=DEFAULT_NAME) + parser.set_defaults(icon=DEFAULT_ICON) + parser.set_defaults(url=DEFAULT_URL) + parser.set_defaults(directory=DEFAULT_DIRECTORY) + parser.set_defaults(engine=DEFAULT_ENGINE) parser.set_defaults(debug=False) options, args = parser.parse_args(argv) # - leonardo_dir = os.path.join(options.directory, 'modules', 'leonardo') - flights_dir = os.path.join(leonardo_dir, 'flights') + flights_dir = os.path.join(options.directory, 'modules', 'leonardo', 'flights') leonardo_url = urljoin(options.url, 'modules.php?name=leonardo') + icon_url = urljoin(options.url, options.icon) # - icon = kml.Icon(href=options.icon) + icon = kml.Icon(href=icon_url) overlay_xy = kml.overlayXY(x=0.5, y=1, xunits='fraction', yunits='fraction') screen_xy = kml.screenXY(x=0.5, y=1, xunits='fraction', yunits='fraction') size = kml.size(x=0, y=0, xunits='fraction', yunits='fraction') - d = {'name': options.name, 'icon': options.icon, 'url': leonardo_url} + d = {'name': options.name, 'icon': icon_url, 'url': leonardo_url} ps = [] ps.append('%(name)s' % d) ps.append('%(name)s' % d) @@ -81,6 +98,7 @@ def main(argv): flights_score_table = Table('leonardo_flights_score', metadata, autoload=True) photos_table = Table('leonardo_photos', metadata, autoload=True) + # flights = [] for flightID in args[1:]: flight_row = flights_table.select(flights_table.c.ID == int(flightID)).execute().fetchone() @@ -91,10 +109,42 @@ def main(argv): flight = Flight(track) flight.glider_type = flight_row.glider flight.url = urljoin(options.url, 'modules.php?name=leonardo&op=show_flight&flightID=%d' % flight_row.ID) + # pilot_row = pilots_table.select(pilots_table.c.pilotID == flight_row.userID).execute().fetchone() if pilot_row is None: raise KeyError, flight_row.userID flight.pilot_name = '%(FirstName)s %(LastName)s' % pilot_row + # + routes = [] + for flight_score_row in flights_score_table.select(flights_score_table.c.flightID == flight_row.ID).execute().fetchall(): + route_name = NAME[flight_score_row.type] + league = LEAGUE[flight_score_row.method] + distance = flight_score_row.distance + score = flight_score_row.score + multiplier = round(flight_score_row.score / flight_score_row.distance, 2) + circuit = CIRCUIT[flight_score_row.type] + tps = [] + for i in xrange(1, 8): + m = B_RECORD_RE.match(flight_score_row['turnpoint%d' % i]) + if not m: + continue + time = datetime.time(*map(int, m.group(1, 2, 3))) + dt = datetime.datetime.combine(flight_row.DATE, time) + lat = int(m.group(4)) + int(m.group(5)) / 60000.0 + if m.group(6) == 'S': + lat = -lat + lon = int(m.group(7)) + int(m.group(8)) / 60000.0 + if m.group(9) == 'W': + lon = -lon + coord = Coord.deg(lat, lon, 0, dt) + name = 'Start' if i == 1 else 'TP%d' % (i - 1) + tp = Turnpoint(name, coord) + tps.append(tp) + tps[-1].name = 'Finish' + route = Route(route_name, league, distance, multiplier, score, circuit, tps) + routes.append(route) + flight.xc = XC(routes) + # if flight_row.hasPhotos: for photo_row in photos_table.select(photos_table.c.flightID == flight_row.ID).execute().fetchall(): photo_url = urljoin(options.url, 'modules/leonardo/flights/%s/%s' % (photo_row.path, photo_row.name)) @@ -103,7 +153,9 @@ def main(argv): if photo_row.description: photo.description = photo_row.description flight.photos.append(photo) + # flights.append(flight) + # kmz = flights2kmz(flights, roots=[screen_overlay]) kmz.write(options.output, '2.2', debug=options.debug)