Skip to content

Instantly share code, notes, and snippets.

@mdornseif
Created August 27, 2012 15:47
Show Gist options
  • Save mdornseif/3489686 to your computer and use it in GitHub Desktop.
Save mdornseif/3489686 to your computer and use it in GitHub Desktop.
Reconstruct your Travel Route based on GPS Information in a folder of Pictures
# Reconstruct your Travel Route based on GPS Information
# in a folder of Pictures
# Files to watch for
pattern = '*.JPG'
# Dirs to search
roots = ['/Users/md/Pictures/iPhoto Library/Originals', '/Users/md/Pictures/Aperture Library.aplibrary/Masters/2012/']
# output is in `reise.kml`
from PIL import Image
from PIL.ExifTags import TAGS
from pprint import pprint
import datetime, os, fnmatch
def get_exif_data(fname):
"""Get embedded EXIF data from image file."""
ret = {}
try:
img = Image.open(fname)
if hasattr(img, '_getexif'):
exifinfo = img._getexif()
if exifinfo != None:
for tag, value in exifinfo.items():
decoded = TAGS.get(tag, tag)
ret[decoded] = value
except IOError:
print 'IOERROR ' + fname
return ret
def get_latlon_data(fname):
i = Image.open(fname)
info = i._getexif()
ret = {}
if not info:
return None, None, None
for tag, value in info.items():
decoded = TAGS.get(tag, tag)
ret[decoded] = value
if (not 'GPSInfo' in ret) or not len(ret['GPSInfo']) >= 3:
return None, None, None
Nsec = ret['GPSInfo'][2][2][0] / float(ret['GPSInfo'][2][2][1])
Nmin = ret['GPSInfo'][2][1][0] / float(ret['GPSInfo'][2][1][1])
Ndeg = ret['GPSInfo'][2][0][0] / float(ret['GPSInfo'][2][0][1])
Wsec = ret['GPSInfo'][4][2][0] / float(ret['GPSInfo'][4][2][1])
Wmin = ret['GPSInfo'][4][1][0] / float(ret['GPSInfo'][4][1][1])
Wdeg = ret['GPSInfo'][4][0][0] / float(ret['GPSInfo'][4][0][1])
if ret['GPSInfo'][1] == 'N':
Nmult = 1
else:
Nmult = -1
if ret['GPSInfo'][3] == 'E':
Wmult = 1
else:
Wmult = -1
Lat = Nmult * (Ndeg + (Nmin + Nsec / 60.0) / 60.0)
Lng = Wmult * (Wdeg + (Wmin + Wsec / 60.0) / 60.0)
dt = None
if 'DateTime' in ret:
dt = datetime.datetime.strptime(ret['DateTime'], '%Y:%m:%d %H:%M:%S')
return Lat, Lng, dt
by_time = {}
for r in roots:
for root, dirs, files in os.walk(r):
for filename in fnmatch.filter(files, pattern):
try:
lat, lng, date = get_latlon_data(os.path.join(root, filename))
except IOError:
raise
continue
if date and date > datetime.datetime(2012, 7, 20):
if date < datetime.datetime(2012, 8, 8):
print lat, lng, date
by_time[date] = (lat, lng, os.path.join(root, filename))
import simplekml
kml = simplekml.Kml()
fol = kml.newfolder(name='Bilder')
coords = []
for date, (lat, lon, img) in sorted(by_time.items()):
coords.append([lon, lat])
pnt = fol.newpoint(name=str(date))
pnt.description = img
pnt.coords = [[lon, lat]]
lin = kml.newlinestring(name="Reiseroute",
coords=coords)
kml.save("reise.kml")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment