From 7f51189c767e82558d0159627b4cab27df1bef7b Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Wed, 26 Dec 2012 14:24:18 +0800 Subject: [PATCH] Separate out GPX specific code from Track processing code Downloaded data is in JSON format --- tests/test_gpx.py | 27 +++++++++++--------- gpx.py => track.py | 61 +++++++++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 37 deletions(-) rename gpx.py => track.py (90%) diff --git a/tests/test_gpx.py b/tests/test_gpx.py index a6af805..4374d8e 100644 --- a/tests/test_gpx.py +++ b/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) @@ -34,7 +37,7 @@ 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 @@ -42,8 +45,8 @@ def test_plot_speeds(xml): 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) @@ -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() @@ -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 @@ -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() diff --git a/gpx.py b/track.py similarity index 90% rename from gpx.py rename to track.py index 952b08e..d0e601a 100644 --- a/gpx.py +++ b/track.py @@ -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, @@ -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') @@ -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