Created
August 27, 2012 15:47
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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