示例#1
0
 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
示例#2
0
 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)
示例#3
0
 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
示例#4
0
    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)
示例#5
0
    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)