Skip to content
This repository has been archived by the owner on Aug 16, 2022. It is now read-only.

Commit

Permalink
Separate out GPX specific code from Track processing code
Browse files Browse the repository at this point in the history
Downloaded data is in JSON format
  • Loading branch information
danni committed Dec 26, 2012
1 parent 6b718d4 commit 7f51189
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 37 deletions.
27 changes: 15 additions & 12 deletions tests/test_gpx.py
@@ -1,30 +1,33 @@
from math import *
import os.path

import pytest

from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap

import gpx
from track import GPX, smooth

@pytest.fixture(params=[
'RK_gpx _2012-12-16_1734.gpx',
# 'RK_gpx _2012-12-18_2012.gpx',
'RK_gpx _2012-12-18_2012.gpx',
])
def xml(request):
fp = open(request.param, 'rb')
filename = os.path.join(os.path.dirname(__file__),
request.param)
fp = open(filename, 'rb')

request.addfinalizer(fp.close)

return fp

def test_import(xml):
track = gpx.Track(xml)
track = GPX(xml)

assert len(track) == 413
# assert len(track) == 413

def test_plot_elevation(xml):
track = gpx.Track(xml)
track = GPX(xml)

fig, ax = plt.subplots(1)

Expand All @@ -34,16 +37,16 @@ def test_plot_elevation(xml):
plt.show()

def test_plot_speeds(xml):
track = gpx.Track(xml)
track = GPX(xml)

# validate sanity
assert len(track.lat[:-1]) == len(track) - 1

vels = track.calculate_vels()
assert len(vels) == len(track) - 1

longsmoo = gpx.smooth(vels.vel, window_len=len(vels) / 2)
shortsmoo = gpx.smooth(vels.vel)
longsmoo = smooth(vels.vel, window_len=len(vels) / 2)
shortsmoo = smooth(vels.vel)
assert len(longsmoo) == len(shortsmoo) == len(vels)

fig, ax = plt.subplots(1)
Expand All @@ -55,7 +58,7 @@ def test_plot_speeds(xml):

def test_plot_anom(xml):

track = gpx.Track(xml)
track = GPX(xml)

anom = track.calculate_vels()

Expand All @@ -66,7 +69,7 @@ def test_plot_anom(xml):
plt.show()

def test_plot_map_vels(xml):
track = gpx.Track(xml)
track = GPX(xml)
vels = track.calculate_vels(smooth_vels=True)

lllat, lllon = min(track.lat) - 0.01, min(track.lon) - 0.01
Expand All @@ -88,5 +91,5 @@ def test_plot_map_vels(xml):

m.drawcoastlines()
m.drawrivers()
m.barbs(x, y, vels.u, vels.v, vels.anom, cmap=plt.get_cmap('RdBu_r'))
m.barbs(x, y, vels.u, vels.v) #, vels.anom, cmap=plt.get_cmap('RdBu_r'))
plt.show()
61 changes: 36 additions & 25 deletions gpx.py → track.py
Expand Up @@ -43,32 +43,8 @@ def smooth(x, window_len=11, window='flat'):

class Track(np.recarray):

NAMESPACES = {
None: 'http://www.topografix.com/GPX/1/1',
'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
}

@staticmethod
def elem(tag, namespace=None):
return tag.format('{%s}' % Track.NAMESPACES[namespace])

def __new__(cls, fp):
track = []

try:
for _, elem in etree.iterparse(fp, tag=Track.elem('{}trkpt')):
lat = float(elem.get('lat'))
lon = float(elem.get('lon'))
elev = float(elem.find(Track.elem('{}ele')).text)
time = datetime.strptime(elem.find(Track.elem('{}time')).text,
'%Y-%m-%dT%H:%M:%SZ')

track.append((lat, lon, elev, time))

elem.clear()
except etree.XMLSyntaxError:
# why is this?
pass
track = cls._parse(fp)

# initialise ourselves as a recarray
return np.array(track,
Expand All @@ -78,6 +54,9 @@ def __new__(cls, fp):
('time', datetime),
]).view(cls)

def _parse(cls, fp):
raise NotImplemented()

def calculate_vels(self, smooth_vels=False):

g = Geod(ellps='WGS84')
Expand Down Expand Up @@ -123,3 +102,35 @@ def calculate_vels(self, smooth_vels=False):
'azi', 'dist', 'vel', 'u', 'v', 'anom'))

return a

class GPX(Track):

NAMESPACES = {
None: 'http://www.topografix.com/GPX/1/1',
'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
}

@staticmethod
def elem(tag, namespace=None):
return tag.format('{%s}' % GPX.NAMESPACES[namespace])

@classmethod
def _parse(cls, fp):
track = []

try:
for _, elem in etree.iterparse(fp, tag=GPX.elem('{}trkpt')):
lat = float(elem.get('lat'))
lon = float(elem.get('lon'))
elev = float(elem.find(GPX.elem('{}ele')).text)
time = datetime.strptime(elem.find(GPX.elem('{}time')).text,
'%Y-%m-%dT%H:%M:%SZ')

track.append((lat, lon, elev, time))

elem.clear()
except etree.XMLSyntaxError:
# why is this?
pass

return track

0 comments on commit 7f51189

Please sign in to comment.