Merge branch 'master' of nano:src/igc2kmz

debian-sid
Tom Payne 15 years ago
commit 97f200297e

@ -33,6 +33,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from igc2kmz.coord import Coord
from igc2kmz.etree import tag
from igc2kmz.gpx import gpx_tag
from igc2kmz.igc import IGC
from igc2kmz.task import Task, Turnpoint
@ -147,9 +148,7 @@ def main(argv):
if options.goal_radius:
goal.radius = int(options.goal_radius)
#
attrs = {'version': '1.1',
'creator': 'http://github.com/twpayne/igc2kmz/wikis'}
with tag(TreeBuilder(), 'gpx', attrs) as tb:
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"?>')

@ -35,6 +35,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from igc2kmz.coord import Coord
from igc2kmz.etree import tag
from igc2kmz.gpx import gpx_tag
from igc2kmz.xc import Route, Turnpoint, XC
@ -114,9 +115,7 @@ def main(argv):
for route in routes:
route.tps[-1].name = 'Finish'
xc = XC(routes)
attrs = {'version': '1.1',
'creator': 'http://github.com/twpayne/igc2kmz/wikis'}
with tag(TreeBuilder(), 'gpx', attrs) as tb:
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"?>')

@ -25,6 +25,30 @@ from coord import Coord
from track import Track
GPX_NAMESPACE = 'http://www.topografix.com/GPX/1/1'
GPX_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
class gpx_tag(object):
def __init__(self, tb):
self.tb = tb
def __enter__(self):
attrs = {
'creator': 'http://github.com/twpayne/igc2kmz/wikis/quickstart',
'version': '1.1',
'xmlns': GPX_NAMESPACE,
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation': 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd',
}
self.tb.start('gpx', attrs)
return self.tb
def __exit__(self, type, value, traceback):
self.tb.end('gpx')
class GPX(object):
def __init__(self, file):
@ -33,11 +57,12 @@ class GPX(object):
except AttributeError:
self.filename = '(unknown)'
self.coords = []
ns = 'http://www.topografix.com/GPX/1/1'
ele_tag_name = '{%s}ele' % ns
time_tag_name = '{%s}time' % ns
ele_tag_name = '{%s}ele' % GPX_NAMESPACE
time_tag_name = '{%s}time' % GPX_NAMESPACE
for trkpt in parse(file).findall('/{%s}trk/{%s}trkseg/{%s}trkpt'
% (ns, ns, ns)):
% (GPX_NAMESPACE,
GPX_NAMESPACE,
GPX_NAMESPACE)):
lat = float(trkpt.get('lat'))
lon = float(trkpt.get('lon'))
ele_tag = trkpt.find(ele_tag_name)
@ -45,7 +70,7 @@ class GPX(object):
time = trkpt.find(time_tag_name)
if time is None:
continue
dt = datetime.strptime(time.text, '%Y-%m-%dT%H:%M:%SZ')
dt = datetime.strptime(time.text, GPX_DATETIME_FORMAT)
coord = Coord(lat, lon, ele, dt)
self.coords.append(coord)

@ -25,6 +25,7 @@ except ImportError:
from coord import Coord
from etree import tag
from gpx import GPX_DATETIME_FORMAT, GPX_NAMESPACE
class Turnpoint(object):
@ -67,7 +68,7 @@ class Turnpoint(object):
tb.data(str(self.coord.ele))
if self.coord.dt:
with tag(tb, 'time'):
tb.data(self.coord.dt.strftime('%Y-%m-%dT%H:%M:%SZ'))
tb.data(self.coord.dt.strftime(GPX_DATETIME_FORMAT))
if self.radius != 400 or not self.enter:
with tag(tb, 'extensions'):
if self.radius != 400:
@ -80,22 +81,24 @@ class Turnpoint(object):
@classmethod
def from_element(cls, element):
name = element.findtext('name').encode('utf_8')
desc_tag = element.find('desc')
name = element.findtext('{%s}name' % GPX_NAMESPACE).encode('utf_8')
desc_tag = element.find('{%s}desc' % GPX_NAMESPACE)
desc = None if desc_tag is None else desc_tag.text.encode('utf_8')
lat = float(element.get('lat'))
lon = float(element.get('lon'))
ele_tag = element.find('ele')
ele_tag = element.find('{%s}ele' % GPX_NAMESPACE)
ele = 0 if ele_tag is None else int(ele_tag.text)
time_tag = element.find('time')
time_tag = element.find('{%s}time' % GPX_NAMESPACE)
if time_tag is None:
dt = None
else:
dt = datetime.datetime.strptime(time_tag.text, '%Y-%m-%dT%H:%M:%SZ')
dt = datetime.datetime.strptime(time_tag.text, GPX_DATETIME_FORMAT)
coord = Coord.deg(lat, lon, ele, dt)
radius_tag = element.find('extensions/radius')
radius_tag = element.find('{%s}extensions/{%s}radius'
% (GPX_NAMESPACE, GPX_NAMESPACE))
radius = 400 if radius_tag is None else int(radius_tag.text)
enter = element.find('extensions/exit') is None
enter = element.find('{%s}extensions/{%s}exit'
% (GPX_NAMESPACE, GPX_NAMESPACE)) is None
return cls(name, coord, radius, enter, desc)
@ -119,12 +122,13 @@ class Task(object):
@classmethod
def from_element(cls, element):
name_tag = element.find('name')
name_tag = element.find('{%s}name' % GPX_NAMESPACE)
name = None if name_tag is None else name_tag.text.encode('utf_8')
tps = map(Turnpoint.from_element, element.findall('rtept'))
rtepts = element.findall('{%s}rtept' % GPX_NAMESPACE)
tps = map(Turnpoint.from_element, rtepts)
return cls(name, tps)
@classmethod
def from_file(cls, file):
element = parse(file)
return cls.from_element(element.find('/rte'))
return cls.from_element(element.find('/{%s}rte' % GPX_NAMESPACE))

@ -17,7 +17,7 @@
from __future__ import with_statement
import datetime
from datetime import datetime
try:
from xml.etree.cElementTree import ElementTree, parse
except ImportError:
@ -25,6 +25,7 @@ except ImportError:
from coord import Coord
from etree import tag
from gpx import GPX_DATETIME_FORMAT, GPX_NAMESPACE
class Turnpoint(object):
@ -42,18 +43,18 @@ class Turnpoint(object):
with tag(tb, 'name'):
tb.data(self.name)
with tag(tb, 'time'):
tb.data(self.coord.dt.strftime('%Y-%m-%dT%H:%M:%SZ'))
tb.data(self.coord.dt.strftime(GPX_DATETIME_FORMAT))
return tb
@classmethod
def from_element(cls, rtept):
name = rtept.findtext('name').encode('utf_8')
name = rtept.findtext('{%s}name' % GPX_NAMESPACE).encode('utf_8')
lat = float(rtept.get('lat'))
lon = float(rtept.get('lon'))
ele_tag = rtept.find('ele')
ele_tag = rtept.find('{%s}ele' % GPX_NAMESPACE)
ele = 0 if ele_tag is None else int(ele_tag.text)
dt = datetime.datetime.strptime(rtept.findtext('time'),
'%Y-%m-%dT%H:%M:%SZ')
time_text = rtept.findtext('{%s}time' % GPX_NAMESPACE)
dt = datetime.strptime(time_text, GPX_DATETIME_FORMAT)
coord = Coord.deg(lat, lon, ele, dt)
return cls(name, coord)
@ -91,13 +92,20 @@ class Route(object):
@classmethod
def from_element(cls, rte):
name = rte.findtext('name').encode('utf_8')
league = rte.findtext('extensions/league').encode('utf_8')
distance = float(rte.findtext('extensions/distance'))
multiplier = float(rte.findtext('extensions/multiplier'))
score = float(rte.findtext('extensions/score'))
circuit = not rte.find('extensions/circuit') is None
tps = map(Turnpoint.from_element, rte.findall('rtept'))
name = rte.findtext('{%s}name' % GPX_NAMESPACE).encode('utf_8')
extensions_tag = rte.find('{%s}extensions' % GPX_NAMESPACE)
league_text = extensions_tag.findtext('{%s}league' % GPX_NAMESPACE)
league = league_text.encode('utf_8')
distance_text = extensions_tag.findtext('{%s}distance' % GPX_NAMESPACE)
distance = float(distance_text)
multiplier_text = extensions_tag.findtext('{%s}multiplier'
% GPX_NAMESPACE)
multiplier = float(multiplier_text)
score = float(extensions_tag.findtext('{%s}score' % GPX_NAMESPACE))
circuit_tag = extensions_tag.find('{%s}circuit' % GPX_NAMESPACE)
circuit = not circuit_tag is None
rtepts = rte.findall('{%s}rtept' % GPX_NAMESPACE)
tps = map(Turnpoint.from_element, rtepts)
return cls(name, league, distance, multiplier, score, circuit, tps)
@ -113,7 +121,8 @@ class XC(object):
@classmethod
def from_element(cls, element):
routes = map(Route.from_element, element.findall('/rte'))
rtes = element.findall('/{%s}rte' % GPX_NAMESPACE)
routes = map(Route.from_element, rtes)
return cls(routes)
@classmethod

Loading…
Cancel
Save