Codebase list twms / upstream/0.07z twms / gpxparse.py
upstream/0.07z

Tree @upstream/0.07z (Download .tar.gz)

gpxparse.py @upstream/0.07zraw · history · blame

# -*- coding: utf-8 -*-
#    This file is part of twms.

# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms specified in COPYING.

import sys, string, bz2, gzip, os
from xml.dom import minidom, Node

class GPXParser:
  def __init__(self, filename):
    self.tracks = {}
    self.pointnum = 0
    self.trknum = 0
    self.bbox = (999,999,-999,-999)
    try:
      file = open(filename)
      signature = file.read(2)
      file.close()
      file = {
        "BZ": lambda f: bz2.BZ2File(f),
        "\x1f\x8b": lambda f: gzip.GzipFile(f),
        "<?": lambda f: open(f)
      }[signature](filename)
    except (OSError, IOError):
      return
    try:
      doc = minidom.parse(file)
      doc.normalize()
    except (KeyboardInterrupt, SystemExit):
      raise
    except:
      return # handle this properly later
    gpx = doc.documentElement
    for node in gpx.getElementsByTagName('trk'):
      self.parseTrack(node)

  def parseTrack(self, trk):
    #name = trk.getElementsByTagName('name')[0].firstChild.data
    name = self.trknum
    self.trknum += 1
    if not name in self.tracks:
      self.tracks[name] = {}
    minlat, minlon, maxlat, maxlon = self.bbox
    for trkseg in trk.getElementsByTagName('trkseg'):
      for trkpt in trkseg.getElementsByTagName('trkpt'):
        lat = float(trkpt.getAttribute('lat'))
        lon = float(trkpt.getAttribute('lon'))
        if lat > maxlat:
          maxlat = lat
        if lat < minlat:
          minlat = lat
        if lon > maxlon:
          maxlon = lon
        if lon < minlon:
          minlon = lon
    #    ele = float(trkpt.getElementsByTagName('ele')[0].firstChild.data)
        rfc3339 = trkpt.getElementsByTagName('time')[0].firstChild.data
        self.pointnum += 1
        self.tracks[name][self.pointnum]={'lat':lat,'lon':lon}
    self.bbox = (minlon, minlat, maxlon, maxlat)

  def getTrack(self, name):
    times = self.tracks[name].keys()
    times.sort()
    points = [self.tracks[name][time] for time in times]
    return [(point['lon'],point['lat']) for point in points]