andrewhao-gpx 0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/ChangeLog +60 -0
- data/Gemfile +4 -0
- data/README.rdoc +46 -0
- data/Rakefile +23 -0
- data/gpx.gemspec +22 -0
- data/lib/gpx.rb +38 -0
- data/lib/gpx/bounds.rb +74 -0
- data/lib/gpx/gpx.rb +46 -0
- data/lib/gpx/gpx_file.rb +302 -0
- data/lib/gpx/magellan_track_log.rb +132 -0
- data/lib/gpx/point.rb +90 -0
- data/lib/gpx/route.rb +58 -0
- data/lib/gpx/segment.rb +207 -0
- data/lib/gpx/track.rb +136 -0
- data/lib/gpx/trackpoint.rb +58 -0
- data/lib/gpx/version.rb +3 -0
- data/lib/gpx/waypoint.rb +74 -0
- data/pkg/gpx-0.7.gem +0 -0
- data/tests/gpx10_test.rb +12 -0
- data/tests/gpx_file_test.rb +48 -0
- data/tests/gpx_files/arches.gpx +1 -0
- data/tests/gpx_files/big.gpx +1 -0
- data/tests/gpx_files/gpx10.gpx +17 -0
- data/tests/gpx_files/magellan_track.log +306 -0
- data/tests/gpx_files/one_segment.gpx +770 -0
- data/tests/gpx_files/one_track.gpx +756 -0
- data/tests/gpx_files/routes.gpx +9 -0
- data/tests/gpx_files/tracks.gpx +6304 -0
- data/tests/gpx_files/waypoints.gpx +20 -0
- data/tests/gpx_files/with_or_without_elev.gpx +29 -0
- data/tests/magellan_test.rb +18 -0
- data/tests/output_test.rb +115 -0
- data/tests/route_test.rb +63 -0
- data/tests/segment_test.rb +58 -0
- data/tests/track_file_test.rb +75 -0
- data/tests/track_point_test.rb +30 -0
- data/tests/track_test.rb +65 -0
- data/tests/waypoint_test.rb +44 -0
- metadata +126 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="Link2GPS - 2.0.2 - http://www.hiketech.com" xsi:schemaLocation="ttp://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"><metadata><name><![CDATA[waypoints.gpx]]></name><time>2006-01-02T08:55:21Z</time><bounds min_lat="25.061783" min_lon="-111.946110" max_lat="50.982883" max_lon="121.640267"/></metadata><extensions/>
|
3
|
+
<wpt lat="40.035557" lon="-105.248268"><name><![CDATA[001]]></name><sym>Waypoint</sym><ele>1639.161</ele><cmt><![CDATA[001]]></cmt><desc><![CDATA[Just some waypoint...]]></desc></wpt>
|
4
|
+
<wpt lat="39.993070" lon="-105.296588"><name><![CDATA[002]]></name><sym>Waypoint</sym><ele>1955.192</ele></wpt>
|
5
|
+
<wpt lat="39.990151" lon="-105.295680"><name><![CDATA[003]]></name><sym>Waypoint</sym><ele>2129.91</ele></wpt>
|
6
|
+
<wpt lat="39.990157" lon="-105.295686"><name><![CDATA[004]]></name><sym>Waypoint</sym><ele>2136.399</ele></wpt>
|
7
|
+
<wpt lat="39.990134" lon="-105.295251"><name><![CDATA[005]]></name><sym>Waypoint</sym><ele>2174.612</ele></wpt>
|
8
|
+
<wpt lat="39.990116" lon="-105.295147"><name><![CDATA[006]]></name><sym>Waypoint</sym><ele>2156.106</ele></wpt>
|
9
|
+
<wpt lat="39.990099" lon="-105.295207"><name><![CDATA[007]]></name><sym>Waypoint</sym><ele>2155.145</ele></wpt>
|
10
|
+
<wpt lat="39.990067" lon="-105.295185"><name><![CDATA[008]]></name><sym>Waypoint</sym><ele>2152.021</ele></wpt>
|
11
|
+
<wpt lat="39.995700" lon="-105.292805"><name><![CDATA[AMPTHT]]></name><sym>Waypoint</sym><ele>1854.735</ele></wpt>
|
12
|
+
<wpt lat="38.855550" lon="-94.799017"><name><![CDATA[GARMIN]]></name><sym>Waypoint</sym><ele>325.0491</ele></wpt>
|
13
|
+
<wpt lat="39.997298" lon="-105.292674"><name><![CDATA[GRG-CA]]></name><sym>Waypoint</sym><ele>1766.535</ele></wpt>
|
14
|
+
<wpt lat="50.982883" lon="-1.463900"><name><![CDATA[GRMEUR]]></name><sym>Waypoint</sym><ele>35.93469</ele></wpt>
|
15
|
+
<wpt lat="33.330190" lon="-111.946110"><name><![CDATA[GRMPHX]]></name><sym>Waypoint</sym><ele>361.0981</ele></wpt>
|
16
|
+
<wpt lat="25.061783" lon="121.640267"><name><![CDATA[GRMTWN]]></name><sym>Waypoint</sym><ele>38.09766</ele></wpt>
|
17
|
+
<wpt lat="39.999840" lon="-105.214696"><name><![CDATA[SBDR]]></name><sym>Waypoint</sym><ele>1612.965</ele></wpt>
|
18
|
+
<wpt lat="39.989739" lon="-105.295285"><name><![CDATA[TO]]></name><sym>Waypoint</sym><ele>2163.556</ele></wpt>
|
19
|
+
<wpt lat="40.035301" lon="-105.254443"><name><![CDATA[VICS]]></name><sym>Waypoint</sym><ele>1535.34</ele></wpt>
|
20
|
+
</gpx>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
2
|
+
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.5" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
|
3
|
+
|
4
|
+
<metadata>
|
5
|
+
<link href="http://www.garmin.com">
|
6
|
+
<text>Garmin International</text>
|
7
|
+
</link>
|
8
|
+
<time>2007-04-16T18:11:47Z</time>
|
9
|
+
<bounds maxlat="40.207429" maxlon="116.670578" minlat="39.876895" minlon="101.636217"/>
|
10
|
+
</metadata>
|
11
|
+
|
12
|
+
<trk>
|
13
|
+
<name>ACTIVE LOG</name>
|
14
|
+
<trkseg>
|
15
|
+
<trkpt lat="40.079434" lon="116.295948">
|
16
|
+
<ele>50.606567</ele>
|
17
|
+
<time>2007-03-25T05:17:34Z</time>
|
18
|
+
</trkpt>
|
19
|
+
</trkseg>
|
20
|
+
</trk>
|
21
|
+
|
22
|
+
<trk>
|
23
|
+
<name>LINE-13</name>
|
24
|
+
<trkseg>
|
25
|
+
<trkpt lat="39.949744" lon="116.427398"/>
|
26
|
+
</trkseg>
|
27
|
+
</trk>
|
28
|
+
|
29
|
+
</gpx>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gpx'
|
3
|
+
|
4
|
+
class MagellanTest < Test::Unit::TestCase
|
5
|
+
MAGELLAN_TRACK_LOG = File.join(File.dirname(__FILE__), "gpx_files/magellan_track.log")
|
6
|
+
GPX_FILE = File.join(File.dirname(__FILE__), "gpx_files/one_segment.gpx")
|
7
|
+
|
8
|
+
def test_convert
|
9
|
+
GPX::MagellanTrackLog.convert_to_gpx(MAGELLAN_TRACK_LOG, "/tmp/gpx_from_magellan.gpx")
|
10
|
+
@gpx_file = GPX::GPXFile.new(:gpx_file => "/tmp/gpx_from_magellan.gpx")
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_file_type
|
14
|
+
assert(GPX::MagellanTrackLog::is_magellan_file?(MAGELLAN_TRACK_LOG))
|
15
|
+
assert(!GPX::MagellanTrackLog::is_magellan_file?(GPX_FILE))
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'gpx'
|
4
|
+
|
5
|
+
class OutputTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include GPX
|
8
|
+
|
9
|
+
def setup
|
10
|
+
FileUtils.mkdir_p(File.join(File.dirname(__FILE__), "output"))
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_new_gpx_file_from_scratch
|
14
|
+
gpx_file = GPXFile.new
|
15
|
+
|
16
|
+
track = Track.new(:name => "My First Track")
|
17
|
+
segment = Segment.new
|
18
|
+
|
19
|
+
track_point_data = [
|
20
|
+
{:lat => 40.036926, :lon =>-105.253487, :time => Time.parse('2005-12-31T22:01:24Z'), :elevation => 1737.24},
|
21
|
+
{:lat => 40.036604, :lon =>-105.253487, :time => Time.parse("2005-12-31T22:02:01Z"), :elevation => 1738.682},
|
22
|
+
{:lat => 40.036347, :lon =>-105.253830, :time => Time.parse("2005-12-31T22:02:08Z"), :elevation => 1738.682},
|
23
|
+
{:lat => 40.035574, :lon =>-105.254045, :time => Time.parse("2005-12-31T22:02:20Z"), :elevation => 1737.24},
|
24
|
+
{:lat => 40.035467, :lon =>-105.254366, :time => Time.parse("2005-12-31T22:02:29Z"), :elevation => 1735.798},
|
25
|
+
{:lat => 40.035317, :lon =>-105.254388, :time => Time.parse("2005-12-31T22:02:33Z"), :elevation => 1735.798},
|
26
|
+
{:lat => 40.035274, :lon =>-105.254431, :time => Time.parse("2005-12-31T22:02:49Z"), :elevation => 1736.278},
|
27
|
+
{:lat => 40.035274, :lon =>-105.254431, :time => Time.parse("2005-12-31T22:02:54Z"), :elevation => 1739.643},
|
28
|
+
{:lat => 40.035317, :lon =>-105.254431, :time => Time.parse("2005-12-31T22:05:08Z"), :elevation => 1732.433},
|
29
|
+
{:lat => 40.035317, :lon =>-105.254431, :time => Time.parse("2005-12-31T22:05:09Z"), :elevation => 1726.665}]
|
30
|
+
|
31
|
+
track_point_data.each do |trk_pt_hash|
|
32
|
+
segment.points << TrackPoint.new(trk_pt_hash)
|
33
|
+
end
|
34
|
+
|
35
|
+
track.segments << segment
|
36
|
+
gpx_file.tracks << track
|
37
|
+
|
38
|
+
waypoint_data = [
|
39
|
+
{:lat => 39.997298, :lon => -105.292674, :name => 'GRG-CA', :sym => 'Waypoint', :ele => '1766.535'},
|
40
|
+
{:lat => 33.330190, :lon => -111.946110, :name => 'GRMPHX', :sym => 'Waypoint', :ele => '361.0981',
|
41
|
+
:cmt => "Hey here's a comment.", :desc => "Somewhere in my backyard.", :fix => '3d', :sat => "8", :hdop => "50.5", :vdop => "6.8", :pdop => "7.6"},
|
42
|
+
{:lat => 25.061783, :lon => 121.640267, :name => 'GRMTWN', :sym => 'Waypoint', :ele => '38.09766'},
|
43
|
+
{:lat => 39.999840, :lon => -105.214696, :name => 'SBDR', :sym => 'Waypoint', :ele => '1612.965'},
|
44
|
+
{:lat => 39.989739, :lon => -105.295285, :name => 'TO', :sym => 'Waypoint', :ele => '2163.556'},
|
45
|
+
{:lat => 40.035301, :lon => -105.254443, :name => 'VICS', :sym => 'Waypoint', :ele => '1535.34'}
|
46
|
+
]
|
47
|
+
|
48
|
+
waypoint_data.each do |wpt_hash|
|
49
|
+
gpx_file.waypoints << Waypoint.new(wpt_hash)
|
50
|
+
end
|
51
|
+
|
52
|
+
route_point_data = [
|
53
|
+
{:lat => 40.035467, :lon =>-105.254366, :time => Time.parse("2005-12-31T22:02:29Z"), :elevation => 1735.798},
|
54
|
+
{:lat => 40.035317, :lon =>-105.254388, :time => Time.parse("2005-12-31T22:02:33Z"), :elevation => 1735.798},
|
55
|
+
{:lat => 40.035274, :lon =>-105.254431, :time => Time.parse("2005-12-31T22:02:49Z"), :elevation => 1736.278} ]
|
56
|
+
|
57
|
+
route = Route.new()
|
58
|
+
route_point_data.each do |rte_pt_hash|
|
59
|
+
route.points << Point.new(rte_pt_hash)
|
60
|
+
end
|
61
|
+
|
62
|
+
gpx_file.routes << route
|
63
|
+
|
64
|
+
gpx_file.write(output_file(name_of_test))
|
65
|
+
|
66
|
+
|
67
|
+
written_gpx_file = GPXFile.new(:gpx_file => output_file(name_of_test))
|
68
|
+
|
69
|
+
assert_equal(File.basename(output_file(name_of_test)), written_gpx_file.name)
|
70
|
+
assert_equal(1, written_gpx_file.tracks.size)
|
71
|
+
assert_equal(1, written_gpx_file.tracks[0].segments.size)
|
72
|
+
assert_equal(track_point_data.size, written_gpx_file.tracks[0].segments[0].points.size)
|
73
|
+
assert_equal(track_point_data.size, written_gpx_file.tracks[0].points.size)
|
74
|
+
|
75
|
+
# Make sure each point in the segment has the attributes it was initialized with
|
76
|
+
written_segment = written_gpx_file.tracks[0].segments[0]
|
77
|
+
track_point_data.each_with_index do |trk_pt_hash, index|
|
78
|
+
trk_pt_hash.each do |key, value|
|
79
|
+
assert_equal(value, written_segment.points[index].send(key))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
# Make sure the one route has the attributes we initialized it with
|
86
|
+
assert_equal(1, written_gpx_file.routes.size)
|
87
|
+
written_route = written_gpx_file.routes[0]
|
88
|
+
assert_equal(route_point_data.size, written_route.points.size)
|
89
|
+
route_point_data.each_with_index do |rte_pt_hash, index|
|
90
|
+
rte_pt_hash.each do |key, value|
|
91
|
+
assert_equal(value, written_route.points[index].send(key))
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Make sure the waypoints have all of the attributes we initialized them with
|
96
|
+
written_waypoints = written_gpx_file.waypoints
|
97
|
+
assert_equal(waypoint_data.size, written_waypoints.size)
|
98
|
+
waypoint_data.each_with_index do |wpt_hash, index|
|
99
|
+
wpt_hash.each do |key, value|
|
100
|
+
assert_equal(value, written_waypoints[index].send(key.to_s), key)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def name_of_test
|
106
|
+
caller[0] =~ /`test_([^']*)'/ and $1
|
107
|
+
end
|
108
|
+
|
109
|
+
def output_file(test_name)
|
110
|
+
File.join(File.dirname(__FILE__), "output/#{test_name}.gpx")
|
111
|
+
end
|
112
|
+
|
113
|
+
THE_WORKS = "<?xml version=\"1.0\"?>\n<gpx xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.topografix.com/GPX/1/1\" version=\"1.1\" creator=\"GPX RubyGem #{GPX::VERSION} Copyright 2006-2009 Doug Fales -- http://gpx.rubyforge.org/\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\n <metadata>\n <name>new_gpx_file_from_scratch.gpx</name>\n <time>%s</time>\n <bounds minlat=\"90.0\" minlon=\"180.0\" maxlat=\"-90.0\" maxlon=\"-180.0\"/>\n </metadata>\n <trk>\n <name/>\n <trkseg>\n <trkpt lat=\"40.036926\" lon=\"-105.253487\">\n <time>2005-12-31T22:01:24Z</time>\n <ele>1737.24</ele>\n </trkpt>\n <trkpt lat=\"40.036604\" lon=\"-105.253487\">\n <time>2005-12-31T22:02:01Z</time>\n <ele>1738.682</ele>\n </trkpt>\n <trkpt lat=\"40.036347\" lon=\"-105.25383\">\n <time>2005-12-31T22:02:08Z</time>\n <ele>1738.682</ele>\n </trkpt>\n <trkpt lat=\"40.035574\" lon=\"-105.254045\">\n <time>2005-12-31T22:02:20Z</time>\n <ele>1737.24</ele>\n </trkpt>\n <trkpt lat=\"40.035467\" lon=\"-105.254366\">\n <time>2005-12-31T22:02:29Z</time>\n <ele>1735.798</ele>\n </trkpt>\n <trkpt lat=\"40.035317\" lon=\"-105.254388\">\n <time>2005-12-31T22:02:33Z</time>\n <ele>1735.798</ele>\n </trkpt>\n <trkpt lat=\"40.035274\" lon=\"-105.254431\">\n <time>2005-12-31T22:02:49Z</time>\n <ele>1736.278</ele>\n </trkpt>\n <trkpt lat=\"40.035274\" lon=\"-105.254431\">\n <time>2005-12-31T22:02:54Z</time>\n <ele>1739.643</ele>\n </trkpt>\n <trkpt lat=\"40.035317\" lon=\"-105.254431\">\n <time>2005-12-31T22:05:08Z</time>\n <ele>1732.433</ele>\n </trkpt>\n <trkpt lat=\"40.035317\" lon=\"-105.254431\">\n <time>2005-12-31T22:05:09Z</time>\n <ele>1726.665</ele>\n </trkpt>\n </trkseg>\n </trk>\n <wpt lat=\"39.997298\" lon=\"-105.292674\">\n <name>GRG-CA</name>\n <sym>Waypoint</sym>\n <ele>1766.535</ele>\n </wpt>\n <wpt lat=\"33.33019\" lon=\"-111.94611\">\n <name>GRMPHX</name>\n <cmt>Hey here's a comment.</cmt>\n <desc>Somewhere in my backyard.</desc>\n <sym>Waypoint</sym>\n <fix>3d</fix>\n <sat>8</sat>\n <hdop>50.5</hdop>\n <vdop>6.8</vdop>\n <pdop>7.6</pdop>\n <ele>361.0981</ele>\n </wpt>\n <wpt lat=\"25.061783\" lon=\"121.640267\">\n <name>GRMTWN</name>\n <sym>Waypoint</sym>\n <ele>38.09766</ele>\n </wpt>\n <wpt lat=\"39.99984\" lon=\"-105.214696\">\n <name>SBDR</name>\n <sym>Waypoint</sym>\n <ele>1612.965</ele>\n </wpt>\n <wpt lat=\"39.989739\" lon=\"-105.295285\">\n <name>TO</name>\n <sym>Waypoint</sym>\n <ele>2163.556</ele>\n </wpt>\n <wpt lat=\"40.035301\" lon=\"-105.254443\">\n <name>VICS</name>\n <sym>Waypoint</sym>\n <ele>1535.34</ele>\n </wpt>\n <rte>\n <name/>\n <rtept lat=\"40.035467\" lon=\"-105.254366\">\n <time>2005-12-31T22:02:29Z</time>\n <ele>1735.798</ele>\n </rtept>\n <rtept lat=\"40.035317\" lon=\"-105.254388\">\n <time>2005-12-31T22:02:33Z</time>\n <ele>1735.798</ele>\n </rtept>\n <rtept lat=\"40.035274\" lon=\"-105.254431\">\n <time>2005-12-31T22:02:49Z</time>\n <ele>1736.278</ele>\n </rtept>\n </rte>\n</gpx>\n"
|
114
|
+
|
115
|
+
end
|
data/tests/route_test.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gpx'
|
3
|
+
|
4
|
+
class RouteTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_read_routes
|
7
|
+
gpx = GPX::GPXFile.new(:gpx_file => File.join(File.dirname(__FILE__), "gpx_files/routes.gpx"))
|
8
|
+
assert_equal(2, gpx.routes.size)
|
9
|
+
first_route = gpx.routes.first
|
10
|
+
assert_equal(3, first_route.points.size)
|
11
|
+
assert_equal('GRG-CA-TO', first_route.name)
|
12
|
+
|
13
|
+
|
14
|
+
# Route 1, First Point
|
15
|
+
# <rtept lat="39.997298" lon="-105.292674">
|
16
|
+
# <name><![CDATA[GRG-CA]]></name>
|
17
|
+
# <sym>Waypoint</sym>
|
18
|
+
# <ele>1766.535</ele>
|
19
|
+
# </rtept>
|
20
|
+
assert_equal(39.997298, first_route.points[0].lat)
|
21
|
+
assert_equal(-105.292674, first_route.points[0].lon)
|
22
|
+
assert_equal(1766.535, first_route.points[0].elevation)
|
23
|
+
|
24
|
+
|
25
|
+
# Route 1, Second Point
|
26
|
+
# <rtept lat="39.995700" lon="-105.292805">
|
27
|
+
# <name><![CDATA[AMPTHT]]></name>
|
28
|
+
# <sym>Waypoint</sym>
|
29
|
+
# <ele>1854.735</ele>
|
30
|
+
# </rtept>
|
31
|
+
assert_equal(39.995700, first_route.points[1].lat)
|
32
|
+
assert_equal(-105.292805, first_route.points[1].lon)
|
33
|
+
assert_equal(1854.735, first_route.points[1].elevation)
|
34
|
+
|
35
|
+
# Route 1, Third Point
|
36
|
+
# <rtept lat="39.989739" lon="-105.295285">
|
37
|
+
# <name><![CDATA[TO]]></name>
|
38
|
+
# <sym>Waypoint</sym>
|
39
|
+
# <ele>2163.556</ele>
|
40
|
+
# </rtept>
|
41
|
+
assert_equal(39.989739, first_route.points[2].lat)
|
42
|
+
assert_equal(-105.295285, first_route.points[2].lon)
|
43
|
+
assert_equal(2163.556, first_route.points[2].elevation)
|
44
|
+
|
45
|
+
|
46
|
+
second_route = gpx.routes[1]
|
47
|
+
assert_equal(1, second_route.points.size)
|
48
|
+
assert_equal('SBDR-SBDR', second_route.name)
|
49
|
+
|
50
|
+
# Route 2, Only Point
|
51
|
+
# <rtept lat="39.999840" lon="-105.214696">
|
52
|
+
# <name><![CDATA[SBDR]]></name>
|
53
|
+
# <sym>Waypoint</sym>
|
54
|
+
# <ele>1612.965</ele>
|
55
|
+
# </rtept>
|
56
|
+
assert_equal(39.999840, second_route.points[0].lat)
|
57
|
+
assert_equal(-105.214696, second_route.points[0].lon)
|
58
|
+
assert_equal(1612.965, second_route.points[0].elevation)
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'yaml'
|
3
|
+
require 'gpx'
|
4
|
+
|
5
|
+
class SegmentTest < Test::Unit::TestCase
|
6
|
+
ONE_SEGMENT = File.join(File.dirname(__FILE__), "gpx_files/one_segment.gpx")
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@gpx_file = GPX::GPXFile.new(:gpx_file => ONE_SEGMENT)
|
10
|
+
@segment = @gpx_file.tracks.first.segments.first
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_segment_read
|
14
|
+
assert_equal(189, @segment.points.size)
|
15
|
+
assert_equal(1144433525, @segment.earliest_point.time.to_i)
|
16
|
+
assert_equal(1144437991, @segment.latest_point.time.to_i)
|
17
|
+
assert_equal(1334.447, @segment.lowest_point.elevation)
|
18
|
+
assert_equal(1480.087, @segment.highest_point.elevation)
|
19
|
+
assert_in_delta(6.98803359528853, @segment.distance, 0.001)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_segment_crop
|
23
|
+
crop_rectangle = GPX::Bounds.new( :min_lat=> 39.173000,
|
24
|
+
:min_lon=> -109.010000,
|
25
|
+
:max_lat=> 39.188000,
|
26
|
+
:max_lon=> -108.999000)
|
27
|
+
@segment.crop(crop_rectangle)
|
28
|
+
|
29
|
+
assert_equal(106, @segment.points.size)
|
30
|
+
assert_in_delta(4.11422061733046, @segment.distance, 0.001)
|
31
|
+
assert_equal(1144435041, @segment.earliest_point.time.to_i)
|
32
|
+
assert_equal(1144437752, @segment.latest_point.time.to_i)
|
33
|
+
assert_equal(1407.027, @segment.lowest_point.elevation)
|
34
|
+
assert_equal(1480.087, @segment.highest_point.elevation)
|
35
|
+
assert_equal(39.173834, @segment.bounds.min_lat)
|
36
|
+
assert_equal(-109.009995, @segment.bounds.min_lon)
|
37
|
+
assert_equal(39.187868, @segment.bounds.max_lat)
|
38
|
+
assert_equal(-108.999546, @segment.bounds.max_lon)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_segment_delete
|
42
|
+
delete_rectangle = GPX::Bounds.new( :min_lat=> 39.173000,
|
43
|
+
:min_lon=> -109.010000,
|
44
|
+
:max_lat=> 39.188000,
|
45
|
+
:max_lon=> -108.999000)
|
46
|
+
@segment.delete_area(delete_rectangle)
|
47
|
+
assert_equal(83, @segment.points.size)
|
48
|
+
assert_in_delta(3.35967118153605, @segment.distance, 0.001)
|
49
|
+
assert_equal(1144433525, @segment.earliest_point.time.to_i)
|
50
|
+
assert_equal(1144437991, @segment.latest_point.time.to_i)
|
51
|
+
assert_equal(1334.447, @segment.lowest_point.elevation)
|
52
|
+
assert_equal(1428.176, @segment.highest_point.elevation)
|
53
|
+
assert_equal(39.180572, @segment.bounds.min_lat)
|
54
|
+
assert_equal(-109.016604, @segment.bounds.min_lon)
|
55
|
+
assert_equal(39.188747, @segment.bounds.max_lat)
|
56
|
+
assert_equal(-109.007978, @segment.bounds.max_lon)
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gpx'
|
3
|
+
|
4
|
+
class TrackFileTest < Test::Unit::TestCase
|
5
|
+
TRACK_FILE = File.join(File.dirname(__FILE__), "gpx_files/tracks.gpx")
|
6
|
+
OTHER_TRACK_FILE = File.join(File.dirname(__FILE__), "gpx_files/arches.gpx")
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@track_file = GPX::GPXFile.new(:gpx_file => TRACK_FILE)
|
10
|
+
@other_track_file = GPX::GPXFile.new(:gpx_file => OTHER_TRACK_FILE)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_track_read
|
14
|
+
assert_equal(3, @track_file.tracks.size)
|
15
|
+
assert_equal("First Track", @track_file.tracks[0].name)
|
16
|
+
assert_equal("Second Track", @track_file.tracks[1].name)
|
17
|
+
assert_equal("Third Track", @track_file.tracks[2].name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_track_segment_and_point_counts
|
21
|
+
# One segment with 398 points...
|
22
|
+
assert_equal(1, @track_file.tracks[0].segments.size)
|
23
|
+
assert_equal(389, @track_file.tracks[0].segments.first.points.size)
|
24
|
+
|
25
|
+
# One segment with 299 points...
|
26
|
+
assert_equal(1, @track_file.tracks[1].segments.size)
|
27
|
+
assert_equal(299, @track_file.tracks[1].segments.first.points.size)
|
28
|
+
|
29
|
+
# Many segments of many different sizes
|
30
|
+
segment_sizes = %w{ 2 2 5 4 2 1 197 31 54 1 15 54 19 26 109 18 9 2 8 3 10 23 21 11 25 32 66 21 2 3 3 4 6 4 4 4 3 3 6 6 27 13 2 }
|
31
|
+
assert_equal(43, @track_file.tracks[2].segments.size)
|
32
|
+
@track_file.tracks[2].segments.each_with_index do |seg, i|
|
33
|
+
assert_equal(segment_sizes[i].to_i, seg.points.size)
|
34
|
+
end
|
35
|
+
last_segment = @track_file.tracks[2].segments.last
|
36
|
+
assert_equal(1680.041, last_segment.points.last.elevation)
|
37
|
+
|
38
|
+
|
39
|
+
second_to_last_segment = @track_file.tracks[2].segments[-2]
|
40
|
+
assert_equal("2006-01-02T00:00:51Z", second_to_last_segment.points.last.time.strftime("%Y-%m-%dT%H:%M:%SZ"))
|
41
|
+
assert_equal(39.998045, second_to_last_segment.points.last.lat)
|
42
|
+
assert_equal(-105.292368, second_to_last_segment.points.last.lon)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_find_nearest_point_by_time
|
46
|
+
time = Time.parse("2005-12-31T22:02:01Z")
|
47
|
+
pt = @track_file.tracks[0].closest_point(time)
|
48
|
+
#puts "pt: #{pt.lat_lon}"
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_find_distance
|
53
|
+
#puts "Distance: #{@other_track_file.distance(:units => 'miles')} miles"
|
54
|
+
#puts "Distance: #{@track_file.distance(:units => 'miles')} miles"
|
55
|
+
end
|
56
|
+
def test_high_low_elevation
|
57
|
+
#puts "Lowest: #{@track_file.lowest_point.elevation} m"
|
58
|
+
#puts "Highest: #{@track_file.highest_point.elevation} m"
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_duration
|
62
|
+
#puts "Duration 1: #{@other_track_file.duration} "
|
63
|
+
#puts "Duration 2: #{@track_file.duration} "
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_average_speed
|
67
|
+
#puts "Speed 1: #{@other_track_file.average_speed} "
|
68
|
+
#puts "Speed 2: #{@track_file.average_speed} "
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_write
|
72
|
+
@other_track_file.write("tests/output/myoutput.gpx")
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gpx'
|
3
|
+
|
4
|
+
class TrackPointTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@point1 = GPX::TrackPoint.new({
|
7
|
+
:lat => 37.7985474,
|
8
|
+
:lon => -122.2554386
|
9
|
+
})
|
10
|
+
@point2 = GPX::TrackPoint.new({
|
11
|
+
:lat => 37.7985583,
|
12
|
+
:lon => -122.2554564
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_haversine_distance_from
|
17
|
+
distance = @point1.haversine_distance_from(@point2)
|
18
|
+
assert_equal(0.00197862991592239, distance)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_pythagorean_distance_from
|
22
|
+
distance = @point1.pythagorean_distance_from(@point2)
|
23
|
+
assert_equal(3.642891416092969e-07, distance)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_law_of_cosines_distance_from
|
27
|
+
distance = @point1.law_of_cosines_distance_from(@point2)
|
28
|
+
assert_equal(0.001982307218559664, distance)
|
29
|
+
end
|
30
|
+
end
|
data/tests/track_test.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gpx'
|
3
|
+
|
4
|
+
class TrackTest < Test::Unit::TestCase
|
5
|
+
ONE_TRACK = File.join(File.dirname(__FILE__), "gpx_files/one_track.gpx")
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@gpx_file = GPX::GPXFile.new(:gpx_file => ONE_TRACK)
|
9
|
+
@track = @gpx_file.tracks.first
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_track_read
|
13
|
+
assert_equal("ACTIVE LOG", @track.name)
|
14
|
+
assert_equal( 182, @track.points.size)
|
15
|
+
assert_equal(8, @track.segments.size)
|
16
|
+
assert_in_delta(3.07249668492626, @track.distance, 0.001)
|
17
|
+
assert_equal(1267.155, @track.lowest_point.elevation)
|
18
|
+
assert_equal(1594.003, @track.highest_point.elevation)
|
19
|
+
assert_equal(38.681488, @track.bounds.min_lat)
|
20
|
+
assert_equal(-109.606948, @track.bounds.min_lon)
|
21
|
+
assert_equal(38.791759, @track.bounds.max_lat)
|
22
|
+
assert_equal(-109.447045, @track.bounds.max_lon)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_track_crop
|
26
|
+
area = GPX::Bounds.new(
|
27
|
+
:min_lat => 38.710000,
|
28
|
+
:min_lon => -109.600000,
|
29
|
+
:max_lat => 38.791759,
|
30
|
+
:max_lon => -109.450000)
|
31
|
+
@track.crop(area)
|
32
|
+
assert_equal("ACTIVE LOG", @track.name)
|
33
|
+
assert_equal( 111, @track.points.size)
|
34
|
+
assert_equal(4, @track.segments.size)
|
35
|
+
assert_in_delta(1.62136024923607, @track.distance, 0.001)
|
36
|
+
assert_equal(1557.954, @track.lowest_point.elevation)
|
37
|
+
assert_equal(1582.468, @track.highest_point.elevation)
|
38
|
+
assert_equal(38.782511, @track.bounds.min_lat)
|
39
|
+
assert_equal(-109.599781, @track.bounds.min_lon)
|
40
|
+
assert_equal(38.789527, @track.bounds.max_lat)
|
41
|
+
assert_equal(-109.594996, @track.bounds.max_lon)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_track_delete
|
45
|
+
area = GPX::Bounds.new(
|
46
|
+
:min_lat => 38.710000,
|
47
|
+
:min_lon => -109.600000,
|
48
|
+
:max_lat => 38.791759,
|
49
|
+
:max_lon => -109.450000)
|
50
|
+
@track.delete_area(area)
|
51
|
+
|
52
|
+
#puts @track
|
53
|
+
#assert_equal("ACTIVE LOG", @track.name)
|
54
|
+
#assert_equal( 111, @track.points.size)
|
55
|
+
#assert_equal(4, @track.segments.size)
|
56
|
+
#assert_equal("1.62136024923607", @track.distance.to_s)
|
57
|
+
#assert_equal(1557.954, @track.lowest_point.elevation)
|
58
|
+
#assert_equal(1582.468, @track.highest_point.elevation)
|
59
|
+
#assert_equal(38.782511, @track.bounds.min_lat)
|
60
|
+
#assert_equal(-109.599781, @track.bounds.min_lon)
|
61
|
+
#assert_equal(38.789527, @track.bounds.max_lat)
|
62
|
+
#assert_equal(-109.594996, @track.bounds.max_lon)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|