Refactor times.

debian-sid
Tom Payne 15 years ago
parent 04e8f6b36f
commit f8dbcc2114

@ -63,9 +63,9 @@ class Flight(object):
rows.append(('Glider type', self.glider_type))
if self.glider_id:
rows.append(('Glider ID', self.glider_id))
rows.append(('Take-off time', (self.track.times[0] + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Landing time', (self.track.times[-1] + globals.timezone_offset).strftime('%H:%M:%S')))
hour, seconds = divmod((self.track.times[-1] - self.track.times[0]).seconds, 3600)
rows.append(('Take-off time', (self.track.bounds.time.min + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Landing time', (self.track.bounds.time.max + globals.timezone_offset).strftime('%H:%M:%S')))
hour, seconds = divmod((self.track.bounds.time.max - self.track.bounds.time.min).seconds, 3600)
minute, second = divmod(seconds, 60)
rows.append(('Duration', '%d:%02d:%02d' % (hour, minute, second)))
if self.track.elevation_data:
@ -82,7 +82,7 @@ class Flight(object):
return kmz.kmz(description)
def make_snippet(self, globals):
strings = [self.track.pilot_name, self.track.glider_type, (self.track.times[0] + globals.timezone_offset).strftime('%Y-%m-%d')]
strings = [self.track.pilot_name, self.track.glider_type, (self.track.bounds.time.min + globals.timezone_offset).strftime('%Y-%m-%d')]
snippet = kml.Snippet(', '.join(s for s in strings if s))
return kmz.kmz(snippet)
@ -151,16 +151,16 @@ class Flight(object):
style = kml.Style(kml.IconStyle(globals.stock.animation_icon, color=self.color, scale=0.5))
folder = kml.Folder(style, name='Animation', open=0, styleUrl=globals.stock.check_hide_children_style.url())
point = kml.Point(coordinates=[self.track.coords[0]], altitudeMode=self.altitude_mode)
timespan = kml.TimeSpan(end=kml.dateTime(self.track.times[0]))
timespan = kml.TimeSpan(end=kml.dateTime(self.track.coords[0].dt))
placemark = kml.Placemark(point, timespan, styleUrl=style.url())
folder.add(placemark)
for i in xrange(1, len(self.track.coords)):
point = kml.Point(coordinates=[self.track.coords[i - 1].halfway_to(self.track.coords[i])], altitudeMode=self.altitude_mode)
timespan = kml.TimeSpan(begin=kml.dateTime(self.track.times[i - 1]), end=kml.dateTime(self.track.times[i]))
timespan = kml.TimeSpan(begin=kml.dateTime(self.track.coords[i - 1].dt), end=kml.dateTime(self.track.coords[i].dt))
placemark = kml.Placemark(point, timespan, styleUrl=style.url())
folder.add(placemark)
point = kml.Point(coordinates=[self.track.coords[-1]], altitudeMode=self.altitude_mode)
timespan = kml.TimeSpan(begin=kml.dateTime(self.track.times[-1]))
timespan = kml.TimeSpan(begin=kml.dateTime(self.track.coords[-1].dt))
placemark = kml.Placemark(point, timespan, styleUrl=style.url())
folder.add(placemark)
return kmz.kmz(folder)
@ -213,7 +213,7 @@ class Flight(object):
max_climb = self.track.climb[i]
climb_hist_data[int(self.track.climb[i] / 0.5)] += 1
dz = float(self.track.coords[end + 1].ele - self.track.coords[start].ele)
dt = self.track.coords.t[end + 1] - self.track.coords.t[start]
dt = self.track.t[end + 1] - self.track.t[start]
dp = self.track.coords[start].distance_to(self.track.coords[end + 1])
rows = []
rows.append(('Altitude gain', '%dm' % dz))
@ -221,9 +221,9 @@ class Flight(object):
rows.append(('Maximum climb', '%.1fm/s' % max_climb))
rows.append(('Start altitude', '%dm' % self.track.coords[start].ele))
rows.append(('Finish alitude', '%dm' % self.track.coords[end + 1].ele))
rows.append(('Start time', (self.track.times[start] + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Finish time', (self.track.times[end + 1] + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Duration', '%d:%02d' % divmod(self.track.coords.t[end + 1] - self.track.coords.t[start], 60)))
rows.append(('Start time', (self.track.coords[start].dt + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Finish time', (self.track.coords[end + 1].dt + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Duration', '%d:%02d' % divmod(self.track.t[end + 1] - self.track.t[start], 60)))
rows.append(('Accumulated altitude gain', '%dm' % total_dz_positive))
rows.append(('Accumulated altitude loss', '%dm' % total_dz_negative))
rows.append(('Drift', '%.1fkm/h' % (3.6 * dp / dt)))
@ -261,7 +261,7 @@ class Flight(object):
chart.set_grid(globals.time_scale.grid_step, scale.grid_step, 2, 2)
y = [globals.graph_height * (v - scale.range[0]) / (scale.range[1] - scale.range[0]) for v in values]
indexes = util.incremental_douglas_peucker(self.time_positions, y, 1, 450)
chart.add_data([self.track.coords.t[i] for i in indexes])
chart.add_data([self.track.t[i] for i in indexes])
chart.add_data([values[i] for i in indexes])
return chart
@ -283,7 +283,7 @@ class Flight(object):
return folder
def to_kmz(self, globals):
self.time_positions = [globals.graph_width * (t - globals.time_scale.range[0]) / (globals.time_scale.range[1] - globals.time_scale.range[0]) for t in self.track.coords.t]
self.time_positions = [globals.graph_width * (t - globals.time_scale.range[0]) / (globals.time_scale.range[1] - globals.time_scale.range[0]) for t in self.track.t]
folder = kmz.kmz(kml.Folder(name=self.track.filename, open=1))
folder.add(self.make_description(globals))
folder.add(self.make_snippet(globals))

@ -10,13 +10,16 @@ def _rad_to_deg(rad):
class Coord(object):
__slots__ = ('lat', 'lon', 'ele')
__slots__ = ('lat', 'lon', 'ele', 'dt')
def __init__(self, lat, lon, ele):
self.lat, self.lon, self.ele = lat, lon, ele
def __init__(self, lat, lon, ele, dt=None):
self.lat = lat
self.lon = lon
self.ele = ele
self.dt = dt
def __repr__(self):
return 'Coord(%f, %f, %f)' % (self.lat, self.lon, self.ele)
return 'Coord(%f, %f, %f, %s)' % (self.lat, self.lon, self.ele, self.dt)
def distance_to(self, other):
"""Return the distance from self to other."""

@ -171,21 +171,13 @@ class IGC(object):
pass
def track(self):
times = []
t = []
for record in self.records:
if isinstance(record, BRecord) and record.ele:
for r in self.records:
if isinstance(r, BRecord) and r.ele:
ele = 'ele'
break
else:
ele = 'alt'
coords = util.TimeSeries()
for record in self.records:
if isinstance(record, BRecord):
coords.append(coord.Coord(record.lat, record.lon, getattr(record, ele)))
times.append(record.dt)
t.append(int(time.mktime(record.dt.timetuple())))
coords.t = t
coords = [coord.Coord(r.lat, r.lon, getattr(r, ele), r.dt) for r in self.records if isinstance(r, BRecord)]
kwargs = {}
kwargs['filename'] = os.path.basename(self.filename)
if 'plt' in self.h and not NOT_SET_RE.match(self.h['plt']):
@ -194,4 +186,4 @@ class IGC(object):
kwargs['glider_type'] = self.h['gty'].strip()
if 'gid' in self.h and not NOT_SET_RE.match(self.h['gid']):
kwargs['glider_id'] = self.h['gid'].strip()
return track.Track(times, coords, **kwargs)
return track.Track(coords, **kwargs)

@ -1,3 +1,5 @@
import time
import util
@ -8,9 +10,9 @@ def do_set(seq, pairs, value):
class Track(object):
def __init__(self, times, coords, **kwargs):
self.times = times
def __init__(self, coords, **kwargs):
self.coords = coords
self.t = [int(time.mktime(c.dt.timetuple())) for c in self.coords]
self.pilot_name = None
self.glider_type = None
self.glider_id = None
@ -22,10 +24,10 @@ class Track(object):
result = []
for i in xrange(1, len(seq)):
left1, right1 = seq[i]
if self.coords.t[left1] - self.coords.t[right0] < delta:
if self.t[left1] - self.t[right0] < delta:
right0 = right1
else:
if delta < self.coords.t[right0] - self.coords.t[left0]:
if delta < self.t[right0] - self.t[left0]:
result.append((left0, right0))
left0, right0 = left1, right1
result.append((left0, right0))
@ -37,7 +39,7 @@ class Track(object):
self.bounds.ele = util.Bounds(self.coords[0].ele)
for coord in self.coords:
self.bounds.ele.update(coord.ele)
self.bounds.time = util.Bounds((self.times[0], self.times[-1]))
self.bounds.time = util.Bounds((self.coords[0].dt, self.coords[-1].dt))
self.elevation_data = self.bounds.ele.min != 0 or self.bounds.ele.max != 0
self.s = [0.0]
for i in xrange(1, n):
@ -61,24 +63,24 @@ class Track(object):
self.progress = []
i0 = i1 = 0
for i in xrange(1, n):
t0 = (self.coords.t[i - 1] + self.coords.t[i]) / 2 - dt / 2
while self.coords.t[i0] <= t0:
t0 = (self.t[i - 1] + self.t[i]) / 2 - dt / 2
while self.t[i0] <= t0:
i0 += 1
if i0 == 0:
coord0 = self.coords[0]
s0 = self.s[0]
else:
delta0 = float(t0 - self.coords.t[i0 - 1]) / (self.coords.t[i0] - self.coords.t[i0 - 1])
delta0 = float(t0 - self.t[i0 - 1]) / (self.t[i0] - self.t[i0 - 1])
coord0 = self.coords[i0 - 1].interpolate(self.coords[i0], delta0)
s0 = (1.0 - delta0) * self.s[i0 - 1] + delta0 * self.s[i0]
t1 = t0 + dt
while i1 < n and self.coords.t[i1] < t1:
while i1 < n and self.t[i1] < t1:
i1 += 1
if i1 == n:
coord1 = self.coords[n - 1]
s1 = self.s[n - 1]
else:
delta1 = float(t1 - self.coords.t[i1 - 1]) / (self.coords.t[i1] - self.coords.t[i1 - 1])
delta1 = float(t1 - self.t[i1 - 1]) / (self.t[i1] - self.t[i1 - 1])
coord1 = self.coords[i1 - 1].interpolate(self.coords[i1], delta1)
s1 = (1.0 - delta1) * self.s[i1 - 1] + delta1 * self.s[i1]
ds = s1 - s0

Loading…
Cancel
Save