Refactor runs to return slices.

debian-sid
Tom Payne 15 years ago
parent 3b5cd3ede7
commit 6c035f3c6b

@ -4,7 +4,6 @@ Glide classification
Glide analysis
Dive analysis
Check floating point use in pygooglechart
Refactor runs to return slices
MEDIUM
Add nice thermal and glide icons

@ -115,9 +115,9 @@ class Flight(object):
folder = kml.Folder(name='Colored by %s' % scale.title, styleUrl=globals.stock.check_hide_children_style.url(), **folder_options)
styles = [kml.Style(kml.LineStyle(color=color, width=self.width)) for color in scale.colors()]
discrete_values = map(scale.discretize, values)
for start, end in util.runs(discrete_values):
line_string = kml.LineString(coordinates=self.track.coords[start:end + 1], altitudeMode=self.altitude_mode)
style_url = kml.styleUrl(styles[discrete_values[start]].url())
for sl in util.runs(discrete_values):
line_string = kml.LineString(coordinates=self.track.coords[sl.start:sl.stop + 1], altitudeMode=self.altitude_mode)
style_url = kml.styleUrl(styles[discrete_values[sl.start]].url())
placemark = kml.Placemark(style_url, line_string)
folder.add(placemark)
icon = kml.Icon(href=kml.CDATA(self.make_scale_chart(globals, scale).get_url()))
@ -198,16 +198,16 @@ class Flight(object):
if not self.track.elevation_data:
return kmz.kmz()
folder = kml.Folder(name='Thermals', styleUrl=globals.stock.check_hide_children_style.url(), visibility=0)
for start, end in self.track.thermals:
c = self.track.coords[start].halfway_to(self.track.coords[end + 1])
for sl in self.track.thermals:
c = self.track.coords[sl.start].halfway_to(self.track.coords[sl.stop])
point = kml.Point(coordinates=[c], altitudeMode='absolute')
line_string = kml.LineString(coordinates=[self.track.coords[start], self.track.coords[end + 1]], altitudeMode='absolute')
line_string = kml.LineString(coordinates=[self.track.coords[sl.start], self.track.coords[sl.stop]], altitudeMode='absolute')
multi_geometry = kml.MultiGeometry(point, line_string)
total_dz_positive = 0
total_dz_negative = 0
max_climb = 0.0
climb_hist_data = [0] * (int(self.track.bounds.climb.max / 0.5) + 1)
for i in xrange(start, end):
for i in xrange(sl.start, sl.stop):
dz = self.track.coords[i + 1].ele - self.track.coords[i].ele
if dz > 0:
total_dz_positive += dz
@ -216,19 +216,19 @@ class Flight(object):
if self.track.climb[i] > max_climb:
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.t[end + 1] - self.track.t[start]
dp = self.track.coords[start].distance_to(self.track.coords[end + 1])
theta = self.track.coords[start].initial_bearing_to(self.track.coords[end + 1])
dz = float(self.track.coords[sl.stop].ele - self.track.coords[sl.start].ele)
dt = self.track.t[sl.stop] - self.track.t[sl.start]
dp = self.track.coords[sl.start].distance_to(self.track.coords[sl.stop])
theta = self.track.coords[sl.start].initial_bearing_to(self.track.coords[sl.stop])
rows = []
rows.append(('Altitude gain', '%dm' % dz))
rows.append(('Average climb', '%.1fm/s' % (dz / dt)))
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.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(('Start altitude', '%dm' % self.track.coords[sl.start].ele))
rows.append(('Finish alitude', '%dm' % self.track.coords[sl.stop].ele))
rows.append(('Start time', (self.track.coords[sl.start].dt + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Finish time', (self.track.coords[sl.stop].dt + globals.timezone_offset).strftime('%H:%M:%S')))
rows.append(('Duration', '%d:%02d' % divmod(self.track.t[sl.stop] - self.track.t[sl.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 %s' % (3.6 * dp / dt, coord.rad_to_compass(theta))))

@ -3,9 +3,9 @@ import time
import util
def do_set(seq, pairs, value):
for pair in pairs:
seq[pair[0]:pair[1]] = [value] * (pair[1] - pair[0])
def do_set(seq, slices, value):
for sl in slices:
seq[sl] = [value] * (sl.stop - sl.start)
class Track(object):
@ -20,17 +20,16 @@ class Track(object):
self.analyse(20)
def merge_adjacent_sequences(self, seq, delta):
left0, right0 = seq[0]
start, stop = seq[0].start, seq[0].stop
result = []
for i in xrange(1, len(seq)):
left1, right1 = seq[i]
if self.t[left1] - self.t[right0] < delta:
right0 = right1
if self.t[seq[i].start] - self.t[stop] < delta:
stop = seq[i].stop
else:
if delta < self.t[right0] - self.t[left0]:
result.append((left0, right0))
left0, right0 = left1, right1
result.append((left0, right0))
if delta < self.t[stop] - self.t[start]:
result.append(slice(start, stop))
start, stop = seq[i].start, seq[i].stop
result.append(slice(start, stop))
return result
def analyse(self, dt):
@ -102,7 +101,7 @@ class Track(object):
self.bounds.climb = util.Bounds(self.climb)
thermal = [self.progress[i] < 0.9 and self.climb[i] >= 0.0 for i in xrange(0, n - 1)]
#self.dive = [self.progress[i] < 0.9 and self.climb[i] < 0.0 for i in xrange(0, n - 1)]
thermal_pairs = [(left, right) for left, right in util.runs(thermal) if thermal[left]]
thermal_pairs = [sl for sl in util.runs(thermal) if thermal[sl.start]]
self.thermals = self.merge_adjacent_sequences(thermal_pairs, 60)
#dive_pairs = self.merge_adjacent_sequences(self.dive, 60)
self.state = [0] * (n - 1)

@ -73,9 +73,9 @@ def runs(seq):
return
for index, element in generator:
if element != current:
yield (start, index)
yield slice(start, index)
start, current = index, element
yield (start, index + 1)
yield slice(start, index + 1)
def douglas_peucker(x, y, epsilon):

Loading…
Cancel
Save