def get_track(self, model_url=None): track = GX.Track(id=self.track_id) track.append(GX.altitudeMode('absolute')) while self.has_next_packet(): self.get_next_packet().append_telemetry_to(track) #if model_url is not None: # track.append(KML.Model(KML.Link(KML.href(model_url)), KML.Orientation(KML.heading(180)))) return track
def generate_update(self, change=None, create=None, delete=None): placemark = GX.Placemark(targetId=self.pm_id) track = GX.Track(targetId=self.track_id) while self.has_next_packet(): placemark.append(KML.description(self.get_description())) self.get_next_packet().append_telemetry_to(track) if placemark.countchildren() > 0: change.append(placemark) if track.countchildren() > 0: create.append(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)