Add photos folder.

debian-sid
Tom Payne 15 years ago
parent cc90b43a83
commit e257b7cc63

@ -3,13 +3,13 @@ Check indexes in thermal folder
Check indexes in colored tracklogs
MEDIUM
Add photo comments
Add nice thermal and glide icons
Add graphs and tracks of other variables (e.g. airspeed)
Clean up air speed track (average)
Improve drift/windspeed algorithm
Graphical thermal analysis
Add XC folder
Add photos
LOW
Support Aircotec TNC files

@ -17,7 +17,7 @@
import datetime
import math
import time
import operator
import third_party.pygooglechart as pygooglechart
@ -67,6 +67,11 @@ class Stock(object):
label_style = kml.LabelStyle(color='9933ffff', scale=self.label_scales[i])
self.time_mark_styles.append(kml.Style(icon_style, label_style))
self.kmz.add_roots(*self.time_mark_styles)
balloon_style = kml.BalloonStyle(text=kml.CDATA('<h3>$[name]</h3>$[description]'))
icon_style = kml.IconStyle(kml.Icon.palette(4, 46), scale=self.icon_scales[0])
label_style = kml.LabelStyle(scale=self.label_scales[0])
self.photo_style = kml.Style(balloon_style, icon_style, label_style)
self.kmz.add_roots(self.photo_style)
self.pixel_url = 'images/pixel.png'
self.kmz.add_files({self.pixel_url: open(self.pixel_url).read()})
self.visible_none_folder = self.make_none_folder(1)
@ -216,6 +221,23 @@ class Flight(object):
else:
return kmz.kmz()
def make_photos_folder(self, globals):
if not len(self.photos):
return kmz.kmz()
folder = kml.Folder(name='Photos', open=0)
for photo in sorted(self.photos, key=operator.attrgetter('dt')):
if photo.coord:
coord = photo.coord
altitude_mode = 'absolute' if photo.elevation_data else 'clampToGround'
else:
coord = self.track.coord_at(photo.dt - globals.timezone_offset)
altitude_mode = self.altitude_mode
point = kml.Point(coordinates=[coord], altitudeMode=altitude_mode)
description = kml.CDATA('<img alt="%s" src="%s" height="%d" width="%d" />' % (photo.name, photo.url, photo.jpeg.height, photo.jpeg.width))
placemark = kml.Placemark(point, kml.Snippet(), name=photo.name, description=description, styleUrl=globals.stock.photo_style.url())
folder.add(placemark)
return kmz.kmz(folder)
def make_climb_chart(self, globals, climb):
chart = pygooglechart.GoogleOMeterChart(100, 100, x_range=(0, 100 * self.track.bounds.climb.max))
chart.add_data([100.0 * climb])
@ -324,15 +346,10 @@ class Flight(object):
folder = kml.Folder(name='Time marks', styleUrl=globals.stock.check_hide_children_style.url(), visibility=0)
folder.add(self.make_time_mark(globals, self.track.coords[0], self.track.coords[0].dt, globals.stock.time_mark_styles[0].url()))
dt = util.datetime_floor(self.track.coords[0].dt, step)
while dt < self.track.coords[0].dt:
while dt <= self.track.coords[0].dt:
dt += step
while True:
t = int(time.mktime(dt.timetuple()))
index = util.find_first_ge(self.track.t, t)
if index is None:
break
delta = float(t - self.track.t[index - 1]) / (self.track.t[index] - self.track.t[index - 1])
coord = self.track.coords[index - 1].interpolate(self.track.coords[index], delta)
while dt < self.track.coords[-1].dt:
coord = self.track.coord_at(dt)
if dt.minute == 0:
style_index = 0
elif dt.minute == 30:
@ -354,6 +371,7 @@ class Flight(object):
folder.add(self.make_animation(globals))
folder.add(self.make_track_folder(globals))
folder.add(self.make_shadow_folder(globals))
folder.add(self.make_photos_folder(globals))
folder.add(self.make_altitude_marks_folder(globals))
if self.track.elevation_data:
folder.add(self.make_graph(globals, [c.ele for c in self.track.coords], globals.scales.altitude))

@ -15,23 +15,46 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import re
import datetime
import os.path
import urllib2
import urlparse
import coord
import exif
class Photo(object):
def __init__(self, url):
if urlparse.urlparse(url).scheme:
self.url = url
else:
self.url = 'file://' + url
components = urlparse.urlparse(url)
self.name = os.path.splitext(os.path.basename(components.path))[0]
self.url = url if components.scheme else 'file://' + os.path.realpath(url)
file = urllib2.urlopen(self.url)
if file.info().typeheader != 'image/jpeg':
raise RuntimeError, '%s: not an image/jpeg' % self.url
self.jpeg = exif.JPEG(file)
value = self.jpeg.exif.get('DateTimeOriginal') or self.jpeg.exif.get('DateTime')
self.dt = exif.parse_datetime(value) if value else None
if 'DateTimeOriginal' in self.jpeg.exif:
self.dt = exif.parse_datetime(self.jpeg.exif['DateTimeOriginal'])
elif 'DateTime' in self.jpeg.exif:
self.dt = exif.parse_datetime(self.jpeg.exif['DateTime'])
else:
self.dt = datetime.datetime(2000, 1, 1)
if 'GPSVersionID' in self.jpeg.exif:
lat = exif.parse_angle(self.jpeg.exif['GPSLatitude'])
if self.jpeg.exif['GPSLatitudeRef'] == 'S\0':
lat = -lat
lon = exif.parse_angle(self.jpeg.exif['GPSLongitude'])
if self.jpeg.exif['GPSLongitudeRef'] == 'W\0':
lon = -lon
if 'GPSAltitude' in self.jpeg.exif:
gps_altitude = self.jpeg.exif['GPSAltitude']
ele = float(gps_altitude[0]) / gps_altitude[1]
self.elevation_data = True
else:
ele = 0
self.elevation_data = False
self.coord = coord.Coord.deg(lat, lon, ele)
else:
self.coord = None
self.elevation_data = None

@ -37,6 +37,17 @@ class Track(object):
self.__dict__.update(kwargs)
self.analyse(20)
def coord_at(self, dt):
t = int(time.mktime(dt.timetuple()))
if t < self.t[0]:
return self.coords[0]
elif self.t[-1] <= t:
return self.coords[-1]
else:
index = util.find_first_ge(self.t, t)
delta = float(t - self.t[index - 1]) / (self.t[index] - self.t[index - 1])
return self.coords[index - 1].interpolate(self.coords[index], delta)
def analyse(self, dt):
n = len(self.coords)
self.bounds = util.BoundsSet()

Loading…
Cancel
Save