Skip to content

Commit

Permalink
parse also routes in GPX; + tests
Browse files Browse the repository at this point in the history
  • Loading branch information
PetrDlouhy committed Apr 18, 2016
1 parent bb83944 commit cccce29
Show file tree
Hide file tree
Showing 3 changed files with 248 additions and 11 deletions.
45 changes: 34 additions & 11 deletions django_gpxpy/gpx_parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,44 @@
logger = logging.getLogger(__name__)


def parse_segment(segment):
track_list_of_points = []
for point in segment.points:
point_in_segment = Point(point.longitude, point.latitude)
track_list_of_points.append(point_in_segment.coords)
return track_list_of_points


def parse_tracks(tracks):
multiline = []
for track in tracks:
for segment in track.segments:
track_list_of_points = parse_segment(segment)
if len(track_list_of_points) > 1:
multiline.append(LineString(track_list_of_points))
return multiline


def parse_routes(routes):
multiline = []
for route in routes:
track_list_of_points = parse_segment(route)
if len(track_list_of_points) > 1:
multiline.append(LineString(track_list_of_points))
return multiline


def parse_gpx(track):
try:
gpx = gpxpy.parse(track)
multiline = []
if gpx.tracks:
multiline = []
for track in gpx.tracks:
for segment in track.segments:
track_list_of_points = []
for point in segment.points:
point_in_segment = Point(point.longitude, point.latitude)
track_list_of_points.append(point_in_segment.coords)

if len(track_list_of_points) > 1:
multiline.append(LineString(track_list_of_points))
return MultiLineString(multiline)
multiline += parse_tracks(gpx.tracks)

if gpx.routes:
multiline += parse_routes(gpx.routes)
return MultiLineString(multiline)

except gpxpy.gpx.GPXException as e:
logger.error("Valid GPX file: %s" % e)
raise ValidationError(u"Vadný GPX soubor: %s" % e)
10 changes: 10 additions & 0 deletions tests/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ def test_gpx_parsing(self):
with open("tests/test_data/test_track.gpx", "r") as f:
multilinestring = parse_gpx(f)
self.assertEquals(multilinestring.num_geom, 26)
self.assertEquals(multilinestring.length, 0.31341761110953986)

def test_gpx_with_route(self):
"""
test if the admin page with RelatedFieldRadioFilter filters loads succesfully
"""
with open("tests/test_data/test_with_route.gpx", "r") as f:
multilinestring = parse_gpx(f)
self.assertEquals(multilinestring.num_geom, 1)
self.assertEquals(multilinestring.length, 0.10557333372775202)

def test_bad_file_parsing(self):
"""
Expand Down
204 changes: 204 additions & 0 deletions tests/test_data/test_with_route.gpx
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
<?xml version="1.0"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1" creator="http://praha.cyclestreets.net/" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
<name>Glinkova to Ji&#x10D;&#xED;nsk&#xE1;</name>
<desc>Cycle: Glinkova to Ji&#x10D;&#xED;nsk&#xE1;</desc>
<link href="http://praha.cyclestreets.net/journey/52337981/"/>
</metadata>
<rte>
<name>Fastest Glinkova to Ji&#x10D;&#xED;nsk&#xE1;</name>
<desc>Fastest cycle journey from Glinkova to Ji&#x10D;&#xED;nsk&#xE1;</desc>
<rtept lon="14.379211" lat="50.097801">
<name>Glinkova</name>
</rtept>
<rtept lon="14.380101" lat="50.097927">
<name>Kanadsk&#xE1;</name>
</rtept>
<rtept lon="14.378704" lat="50.098923">
<name>Kanadsk&#xE1;</name>
</rtept>
<rtept lon="14.378958" lat="50.099014">
<name>Kanadsk&#xE1;</name>
</rtept>
<rtept lon="14.378977" lat="50.099152">
<name>Velvarsk&#xE1;</name>
</rtept>
<rtept lon="14.386019" lat="50.099346">
<name>Velvarsk&#xE1;</name>
</rtept>
<rtept lon="14.387591" lat="50.098652">
<name>Gymnasijn&#xED;</name>
</rtept>
<rtept lon="14.387708" lat="50.098488">
<name>Gener&#xE1;la P&#xED;ky</name>
</rtept>
<rtept lon="14.39564" lat="50.098152">
<name>Svatov&#xED;tsk&#xE1;, 7</name>
</rtept>
<rtept lon="14.395782" lat="50.096584">
<name>Svatov&#xED;tsk&#xFD; most, 7</name>
</rtept>
<rtept lon="14.395905" lat="50.09589">
<name>7</name>
</rtept>
<rtept lon="14.396762" lat="50.094929">
<name>7</name>
</rtept>
<rtept lon="14.396804" lat="50.094917">
<name>Milady Hor&#xE1;kov&#xE9;</name>
</rtept>
<rtept lon="14.397845" lat="50.095135">
<name>P&#x159;ivad&#x11B;&#x10D;</name>
</rtept>
<rtept lon="14.398063" lat="50.095165">
<name>Spojka bez n&#xE1;zvu</name>
</rtept>
<rtept lon="14.398278" lat="50.095158">
<name>Ministerstvo obrany</name>
</rtept>
<rtept lon="14.398527" lat="50.095188">
<name>Na Valech</name>
</rtept>
<rtept lon="14.405325" lat="50.096306">
<name>Na Valech</name>
</rtept>
<rtept lon="14.408008" lat="50.096859">
<name>Badeniho</name>
</rtept>
<rtept lon="14.408228" lat="50.096508">
<name>Local cycle network (cz:MHP) X159</name>
</rtept>
<rtept lon="14.408328" lat="50.096535">
<name>Local cycle network (cz:MHP) X159</name>
</rtept>
<rtept lon="14.408383" lat="50.096443">
<name>Local cycle network (cz:MHP) X159</name>
</rtept>
<rtept lon="14.411269" lat="50.095829">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.411738" lat="50.095428">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.411576" lat="50.094402">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.412728" lat="50.094124">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.412863" lat="50.094135">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.413062" lat="50.094082">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.413228" lat="50.09391">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.414841" lat="50.093616">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.415844" lat="50.09383">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.415886" lat="50.093838">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.416043" lat="50.093864">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.416057" lat="50.093868">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.416678" lat="50.094028">
<name>Letensk&#xE9; sady</name>
</rtept>
<rtept lon="14.41674" lat="50.093956">
<name>n&#xE1;b&#x159;e&#x17E;&#xED; Edvarda Bene&#x161;e</name>
</rtept>
<rtept lon="14.423727" lat="50.094933">
<name>n&#xE1;b&#x159;e&#x17E;&#xED; Edvarda Bene&#x161;e</name>
</rtept>
<rtept lon="14.42381" lat="50.094971">
<name>Vltava, levob&#x159;e&#x17E;n&#xED; trasa (n&#xE1;vrh-local)</name>
</rtept>
<rtept lon="14.426526" lat="50.095245">
<name>Tunnel</name>
</rtept>
<rtept lon="14.426929" lat="50.095306">
<name>Vltava, levob&#x159;e&#x17E;n&#xED; trasa (n&#xE1;vrh-local)</name>
</rtept>
<rtept lon="14.429901" lat="50.095875">
<name>n&#xE1;b&#x159;e&#x17E;&#xED; Kapit&#xE1;na Jaro&#x161;e</name>
</rtept>
<rtept lon="14.434615" lat="50.097027">
<name>P&#x159;ivad&#x11B;&#x10D;</name>
</rtept>
<rtept lon="14.436833" lat="50.097504">
<name>P&#x159;ivad&#x11B;&#x10D;</name>
</rtept>
<rtept lon="14.437007" lat="50.097401">
<name>Hl&#xE1;vk&#x16F;v most</name>
</rtept>
<rtept lon="14.437046" lat="50.094006">
<name>8</name>
</rtept>
<rtept lon="14.437652" lat="50.089714">
<name>8 continuation</name>
</rtept>
<rtept lon="14.437666" lat="50.089046">
<name>Bridge</name>
</rtept>
<rtept lon="14.437291" lat="50.086975">
<name>Spojka bez n&#xE1;zvu</name>
</rtept>
<rtept lon="14.437168" lat="50.08662">
<name>Bolzanova</name>
</rtept>
<rtept lon="14.437378" lat="50.086563">
<name>Husitsk&#xE1;</name>
</rtept>
<rtept lon="14.437754" lat="50.086319">
<name>Husitsk&#xE1;</name>
</rtept>
<rtept lon="14.437895" lat="50.086231">
<name>Seifertova</name>
</rtept>
<rtept lon="14.441903" lat="50.085171">
<name>Seifertova</name>
</rtept>
<rtept lon="14.442027" lat="50.085217">
<name>Seifertova</name>
</rtept>
<rtept lon="14.453342" lat="50.084026">
<name>Seifertova</name>
</rtept>
<rtept lon="14.453485" lat="50.083992">
<name>T&#xE1;boritsk&#xE1;</name>
</rtept>
<rtept lon="14.456032" lat="50.082481">
<name>Spojka bez n&#xE1;zvu</name>
</rtept>
<rtept lon="14.4561" lat="50.08239">
<name>Ond&#x159;&#xED;&#x10D;kova</name>
</rtept>
<rtept lon="14.456171" lat="50.082199">
<name>Ond&#x159;&#xED;&#x10D;kova</name>
</rtept>
<rtept lon="14.456102" lat="50.0821">
<name>Ond&#x159;&#xED;&#x10D;kova</name>
</rtept>
<rtept lon="14.455309" lat="50.081753">
<name>Radho&#x161;&#x165;sk&#xE1;</name>
</rtept>
<rtept lon="14.456706" lat="50.078411">
<name>P&#x159;emyslovsk&#xE1;</name>
</rtept>
<rtept lon="14.460605" lat="50.078785">
<name>Ji&#x10D;&#xED;nsk&#xE1;</name>
</rtept>
<rtept lon="14.460632" lat="50.078697">
<name>Finish</name>
</rtept>
</rte>
</gpx>

0 comments on commit cccce29

Please sign in to comment.