def build_xml(self): track = GX.Track() for position in self.track.positions: track.append( KML.when( "%s" % (position.timestamp.strftime('%Y-%m-%dT%H:%M:%SZ'), ))) for position in self.track.positions: track.append( GX.coord("%f %f %d" % (float(position.lon) / 10000000, float(position.lat) / 10000000, position.alt))) return track
def build_xml(self): track = GX.Track( ) for position in self.track.positions: track.append(KML.when("%s" % ( position.timestamp.strftime('%Y-%m-%dT%H:%M:%SZ'),) )) for position in self.track.positions: track.append(GX.coord("%f %f %d" % ( float(position.lon)/10000000, float(position.lat)/10000000, position.alt)) ) return track
def appendTrackPlacemarks(self, doc, directory, et): """ Append to the KML document doc a folder containing one or more tracks for the JPEG files in directory, and a folder containing a set of placemarks for each file. A separate track will be generated for each day, assigning colours in a cycle from the colourSet. Arguments: doc: the KML document to which the folder will be appended directory: the abspath to the directory containing the files et: an ExifTool object """ # Extract time, orientation and GPS metadata from EXIF items = [ 'EXIF:DateTimeOriginal', 'EXIF:GPSStatus', 'EXIF:GPSMeasureMode', 'EXIF:GPSLongitude', 'EXIF:GPSLongitudeRef', 'EXIF:GPSLatitude', 'EXIF:GPSLatitudeRef', 'EXIF:GPSAltitude' ] basedir = os.path.basename(directory) # Gather JPEG metadata into places places = {} for f in os.listdir(directory): if self.verbosity > 0: print('search for JPEG files in ' + directory, file=sys.stderr) filebase, fileext = os.path.splitext(f) if fileext in ('.jpg', '.JPG', '.jpeg', '.JPEG'): filepath = os.path.join(directory, f) in_kml = '' tags = et.get_tags(items, filepath) if self.verbosity > 1: for k in tags: print(k, ' = ', tags[k], file=sys.stderr) if 'EXIF:GPSLongitude' in tags: # GPS metadata id available lat = lon = None datestr = timestr = '' alt = 0 if "EXIF:GPSLatitude" in tags: lat = tags['EXIF:GPSLatitude'] if 'EXIF:GPSLatitudeRef' in tags and \ tags['EXIF:GPSLatitudeRef'] == 'S': lat = -lat if "EXIF:GPSLongitude" in tags: lon = tags['EXIF:GPSLongitude'] if 'EXIF:GPSLongitudeRef' in tags and \ tags['EXIF:GPSLongitudeRef'] == 'W': lon = -lon if "EXIF:DateTimeOriginal" in tags: m = re.match( r'\s*(\d+:\d+:\d+)\s+' r'(\d+:\d+:[\d.]+)\s*', tags['EXIF:DateTimeOriginal']) datestr = re.sub(r':', '-', m.group(1)) timestr = m.group(2) if "EXIF:GPSAltitude" in tags: alt = tags['EXIF:GPSAltitude'] if self.verbosity > 1: print(datestr, timestr, lat, lon, alt, '\n', file=sys.stderr) if datestr and timestr and lat and lon: in_kml = ' in kml' if datestr not in places: places[datestr] = {} timefile = timestr + filebase if timefile not in places[datestr]: places[datestr][timefile] = {} jpegmeta = places[datestr][timefile] jpegmeta['filebase'] = filebase jpegmeta['time'] = GX.when('T'.join(datestr, timestr)) jpegmeta['place'] = \ GX.coord('{0} {1} {2}'.format(lon, lat, alt)) jpegmeta['point'] = \ KML.Point( KML.coordinates('{0},{1},{2}'.format\ (lon, lat, 0))) if self.config['arguments']['url']: jpegmeta['fileurl'] = '/'.join( self.config['arguments']['url'], basedir, f) else: jpegmeta['fileurl'] = '/'.join('file:/', filepath) if self.verbosity > 0: print(' ' + f, in_kml, file=sys.stderr) # Build the track folder and placemark folder track_folder = KML.Folder() image_folder = KML.Folder() for datestr in sorted(places.keys()): colourID = '#colour' + str(self.colourIndex) placemark = KML.Placemark( KML.visibility('1'), KML.name(basedir), KML.description('Path taken at ' + basedir + ' on ' + datestr), KML.styleUrl(colourID)) self.colourIndex = (self.colourIndex + 1) % self.colourSetLen track = GX.Track(KML.altitudeMode('clampToGround')) for tf in sorted(places[datestr].keys()): # append when elements track.append(places[datestr][tf]['time']) for tf in sorted(places[datestr].keys()): # append coord elements track.append(jpegmeta[tf]['place']) placemark.append(track) track_folder.append(placemark) for tf in sorted(places[datestr].keys()): jpegmeta = places[datestr][tf] jpg = jpegmeta['filebase'] cdatakey = 'CDATA' + directory + datestr + jpg self.cdatatext[cdatakey] = ('<![CDATA[<img src="' + jpegmeta['fileurl'] + ' width=400/><br/>' + 'Taken at ' + directory + ' on ' + datestr + '<br/>]]>') image_folder.append( KML.Placemark(KML.visibility('1'), KML.styleUrl('#picture'), KML.name(jpg), KML.description('{' + cdatakey + '}'), jpegmeta['point'])) doc.append(track_folder) doc.append(image_folder)
def read_track_from_gpx(self, filepath, filebase, trackfolder, colourIndex): """ Read a single GPX file and extract the track(s), converting them to a list of KML tracks. Append or replace each track in the trackfolder. This fills the trackfolder in makekml. Arguments: filepath: the full path to the GPX file filebase: the basename of the GPX file, used to name the KML tracks trackfolder: a KML.Folder to hold track Placemarks colourIndex: the next colourIndex to use when creating a linestyle On successful exit, trackfolder and colourIndex will have been updated. """ args = self.config['arguments'] gpxtree = etree.parse(filepath).getroot() namespace = gpxtree.nsmap[None] if self.verbosity > 1: print('namespace for ' + filepath + ': ' + namespace, file=sys.stderr) print('{%s}trk' % namespace, file=sys.stderr) print(namespace + 'trk', file=sys.stderr) for gpxtrack in gpxtree.getiterator('{%s}trk' % namespace): print('got here', file=sys.stderr) # Extract the track name from the GPX track try: trackname = gpxtrack.find('{%s}name' % namespace).text except: print('track does not have name in ' + filepath, file=sys.stderr) trackname = filebase print('trackname = ' + trackname, file=sys.stderr) # does a Placemark already exist with this name? placemark = None for pm in trackfolder.findall('GX.Placemark'): if pm.find('KML.name').text == trackname: placemark = pm break if 'replace' in args and args['replace']: trackfolder.drop(placemark) placemark = None if not placemark: # Create a new Placemark to hold the KML track(s) colourID = '#colour' + str(self.colourIndex) self.colourIndex = (self.colourIndex + 1) % self.colourSetLen placemark = KML.Placemark( KML.visibility('1'), KML.name(trackname), KML.description(trackname + ' from ' + filebase), KML.styleUrl(colourID)) trackfolder.append(placemark) tracklist = [] for gpxtrkseg in gpxtrack.getiterator('{%s}trkseg' % namespace): # A GPX trkseg translates into aGX.track kmltrack = GX.Track(KML.altitudeMode('clampToGround')) whenlist = [] coordlist = [] for gpxtrkpoint in gpxtrkseg: lat = gpxtrkpoint.attrib['lat'] lon = gpxtrkpoint.attrib['lon'] alt = gpxtrkpoint.find('{%s}ele' % namespace).text time = gpxtrkpoint.find('{%s}time' % namespace).text whenlist.append(GX.when(time)) coordlist.append( GX.coord('{0} {1} {2}'.format(lon, lat, alt))) for w in whenlist: kmltrack.append(w) for c in coordlist: kmltrack.append(c) tracklist.append(kmltrack) if tracklist: if len(tracklist) > 1: multitrack = GX.MultiTrack() for t in tracklist: multitrack.append(t) placemark.append(multitrack) else: placemark.append(tracklist[0]) else: print('no tracks found in ' + filepath, file=sys.stderr)
def append_telemetry_to(self, element): #if self.has_timestamp(): # element.append(KML.when(self.get_nice_timestamp())) if self.has_position(): if self.packet.position[2] != 110001: element.append(GX.coord(self.get_nice_position()))
def appendTrackPlacemarks(self, doc, directory, et): """ Append to the KML document doc a folder containing one or more tracks for the JPEG files in directory, and a folder containing a set of placemarks for each file. A separate track will be generated for each day, assigning colours in a cycle from the colourSet. Arguments: doc: the KML document to which the folder will be appended directory: the abspath to the directory containing the files et: an ExifTool object """ # Extract time, orientation and GPS metadata from EXIF items = ['EXIF:DateTimeOriginal', 'EXIF:GPSStatus', 'EXIF:GPSMeasureMode', 'EXIF:GPSLongitude', 'EXIF:GPSLongitudeRef', 'EXIF:GPSLatitude', 'EXIF:GPSLatitudeRef', 'EXIF:GPSAltitude'] basedir = os.path.basename(directory) # Gather JPEG metadata into places places = {} for f in os.listdir(directory): if self.verbosity > 0: print('search for JPEG files in ' + directory, file=sys.stderr) filebase, fileext = os.path.splitext(f) if fileext in ('.jpg', '.JPG', '.jpeg', '.JPEG'): filepath = os.path.join(directory, f) in_kml = '' tags = et.get_tags(items, filepath) if self.verbosity > 1: for k in tags: print(k, ' = ', tags[k], file=sys.stderr) if 'EXIF:GPSLongitude' in tags: # GPS metadata id available lat = lon = None datestr = timestr = '' alt = 0 if "EXIF:GPSLatitude" in tags: lat = tags['EXIF:GPSLatitude'] if 'EXIF:GPSLatitudeRef' in tags and \ tags['EXIF:GPSLatitudeRef'] == 'S': lat = -lat if "EXIF:GPSLongitude" in tags: lon = tags['EXIF:GPSLongitude'] if 'EXIF:GPSLongitudeRef' in tags and \ tags['EXIF:GPSLongitudeRef'] == 'W': lon = -lon if "EXIF:DateTimeOriginal" in tags: m = re.match(r'\s*(\d+:\d+:\d+)\s+' r'(\d+:\d+:[\d.]+)\s*', tags['EXIF:DateTimeOriginal']) datestr = re.sub(r':', '-', m.group(1)) timestr = m.group(2) if "EXIF:GPSAltitude" in tags: alt = tags['EXIF:GPSAltitude'] if self.verbosity > 1: print(datestr, timestr, lat, lon, alt, '\n', file=sys.stderr) if datestr and timestr and lat and lon: in_kml = ' in kml' if datestr not in places: places[datestr] = {} timefile = timestr + filebase if timefile not in places[datestr]: places[datestr][timefile] = {} jpegmeta = places[datestr][timefile] jpegmeta['filebase'] = filebase jpegmeta['time'] = GX.when('T'.join(datestr, timestr)) jpegmeta['place'] = \ GX.coord('{0} {1} {2}'.format(lon, lat, alt)) jpegmeta['point'] = \ KML.Point( KML.coordinates('{0},{1},{2}'.format\ (lon, lat, 0))) if self.config['arguments']['url']: jpegmeta['fileurl'] = '/'.join( self.config['arguments']['url'], basedir, f) else: jpegmeta['fileurl'] = '/'.join('file:/', filepath) if self.verbosity > 0: print(' ' + f, in_kml, file=sys.stderr) # Build the track folder and placemark folder track_folder = KML.Folder() image_folder = KML.Folder() for datestr in sorted(places.keys()): colourID = '#colour' + str(self.colourIndex) placemark = KML.Placemark( KML.visibility('1'), KML.name(basedir), KML.description('Path taken at ' + basedir + ' on ' + datestr), KML.styleUrl(colourID) ) self.colourIndex = (self.colourIndex + 1) % self.colourSetLen track = GX.Track( KML.altitudeMode('clampToGround') ) for tf in sorted(places[datestr].keys()): # append when elements track.append(places[datestr][tf]['time']) for tf in sorted(places[datestr].keys()): # append coord elements track.append(jpegmeta[tf]['place']) placemark.append(track) track_folder.append(placemark) for tf in sorted(places[datestr].keys()): jpegmeta = places[datestr][tf] jpg = jpegmeta['filebase'] cdatakey = 'CDATA' + directory + datestr + jpg self.cdatatext[cdatakey] = ('<![CDATA[<img src="' + jpegmeta['fileurl'] + ' width=400/><br/>' + 'Taken at ' + directory + ' on ' + datestr + '<br/>]]>') image_folder.append( KML.Placemark( KML.visibility('1'), KML.styleUrl('#picture'), KML.name(jpg), KML.description('{' + cdatakey + '}'), jpegmeta['point'] ) ) doc.append(track_folder) doc.append(image_folder)
def read_track_from_gpx(self, filepath, filebase, trackfolder, colourIndex): """ Read a single GPX file and extract the track(s), converting them to a list of KML tracks. Append or replace each track in the trackfolder. This fills the trackfolder in makekml. Arguments: filepath: the full path to the GPX file filebase: the basename of the GPX file, used to name the KML tracks trackfolder: a KML.Folder to hold track Placemarks colourIndex: the next colourIndex to use when creating a linestyle On successful exit, trackfolder and colourIndex will have been updated. """ args = self.config['arguments'] gpxtree = etree.parse(filepath).getroot() namespace = gpxtree.nsmap[None] if self.verbosity > 1: print('namespace for ' + filepath + ': ' + namespace, file=sys.stderr) print('{%s}trk' % namespace, file=sys.stderr) print(namespace + 'trk', file=sys.stderr) for gpxtrack in gpxtree.getiterator('{%s}trk' % namespace): print('got here', file=sys.stderr) # Extract the track name from the GPX track try: trackname = gpxtrack.find('{%s}name' % namespace).text except: print('track does not have name in ' + filepath, file=sys.stderr) trackname = filebase print('trackname = ' + trackname, file=sys.stderr) # does a Placemark already exist with this name? placemark = None for pm in trackfolder.findall('GX.Placemark'): if pm.find('KML.name').text == trackname: placemark = pm break if 'replace' in args and args['replace']: trackfolder.drop(placemark) placemark = None if not placemark: # Create a new Placemark to hold the KML track(s) colourID = '#colour' + str(self.colourIndex) self.colourIndex = (self.colourIndex + 1) % self.colourSetLen placemark = KML.Placemark( KML.visibility('1'), KML.name(trackname), KML.description(trackname + ' from ' + filebase), KML.styleUrl(colourID) ) trackfolder.append(placemark) tracklist = [] for gpxtrkseg in gpxtrack.getiterator('{%s}trkseg' % namespace): # A GPX trkseg translates into aGX.track kmltrack = GX.Track( KML.altitudeMode('clampToGround') ) whenlist = [] coordlist = [] for gpxtrkpoint in gpxtrkseg: lat = gpxtrkpoint.attrib['lat'] lon = gpxtrkpoint.attrib['lon'] alt = gpxtrkpoint.find('{%s}ele'% namespace).text time = gpxtrkpoint.find('{%s}time'% namespace).text whenlist.append(GX.when(time)) coordlist.append(GX.coord('{0} {1} {2}'.format(lon, lat, alt))) for w in whenlist: kmltrack.append(w) for c in coordlist: kmltrack.append(c) tracklist.append(kmltrack) if tracklist: if len(tracklist) > 1: multitrack = GX.MultiTrack() for t in tracklist: multitrack.append(t) placemark.append(multitrack) else: placemark.append(tracklist[0]) else: print('no tracks found in ' + filepath, file=sys.stderr)