gpx 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +43 -0
- data/Rakefile +81 -0
- data/lib/gpx.rb +37 -0
- data/lib/gpx/bounds.rb +83 -0
- data/lib/gpx/gpx.rb +53 -0
- data/lib/gpx/gpx_file.rb +222 -0
- data/lib/gpx/magellan_track_log.rb +134 -0
- data/lib/gpx/point.rb +103 -0
- data/lib/gpx/route.rb +65 -0
- data/lib/gpx/segment.rb +217 -0
- data/lib/gpx/track.rb +149 -0
- data/lib/gpx/trackpoint.rb +35 -0
- data/lib/gpx/waypoint.rb +73 -0
- data/tests/gpx_files/arches.gpx +1 -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 +1 -0
- data/tests/gpx_files/tracks.gpx +6304 -0
- data/tests/gpx_files/waypoints.gpx +1 -0
- data/tests/magellan_test.rb +18 -0
- data/tests/segment_test.rb +57 -0
- data/tests/track_file_test.rb +75 -0
- data/tests/track_test.rb +65 -0
- metadata +70 -0
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><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/><wpt lat="40.035557" lon="-105.248268"><name><![CDATA[001]]></name><sym>Waypoint</sym><ele>1639.161</ele></wpt><wpt lat="39.993070" lon="-105.296588"><name><![CDATA[002]]></name><sym>Waypoint</sym><ele>1955.192</ele></wpt><wpt lat="39.990151" lon="-105.295680"><name><![CDATA[003]]></name><sym>Waypoint</sym><ele>2129.91</ele></wpt><wpt lat="39.990157" lon="-105.295686"><name><![CDATA[004]]></name><sym>Waypoint</sym><ele>2136.399</ele></wpt><wpt lat="39.990134" lon="-105.295251"><name><![CDATA[005]]></name><sym>Waypoint</sym><ele>2174.612</ele></wpt><wpt lat="39.990116" lon="-105.295147"><name><![CDATA[006]]></name><sym>Waypoint</sym><ele>2156.106</ele></wpt><wpt lat="39.990099" lon="-105.295207"><name><![CDATA[007]]></name><sym>Waypoint</sym><ele>2155.145</ele></wpt><wpt lat="39.990067" lon="-105.295185"><name><![CDATA[008]]></name><sym>Waypoint</sym><ele>2152.021</ele></wpt><wpt lat="39.995700" lon="-105.292805"><name><![CDATA[AMPTHT]]></name><sym>Waypoint</sym><ele>1854.735</ele></wpt><wpt lat="38.855550" lon="-94.799017"><name><![CDATA[GARMIN]]></name><sym>Waypoint</sym><ele>325.0491</ele></wpt><wpt lat="39.997298" lon="-105.292674"><name><![CDATA[GRG-CA]]></name><sym>Waypoint</sym><ele>1766.535</ele></wpt><wpt lat="50.982883" lon="-1.463900"><name><![CDATA[GRMEUR]]></name><sym>Waypoint</sym><ele>35.93469</ele></wpt><wpt lat="33.330190" lon="-111.946110"><name><![CDATA[GRMPHX]]></name><sym>Waypoint</sym><ele>361.0981</ele></wpt><wpt lat="25.061783" lon="121.640267"><name><![CDATA[GRMTWN]]></name><sym>Waypoint</sym><ele>38.09766</ele></wpt><wpt lat="39.999840" lon="-105.214696"><name><![CDATA[SBDR]]></name><sym>Waypoint</sym><ele>1612.965</ele></wpt><wpt lat="39.989739" lon="-105.295285"><name><![CDATA[TO]]></name><sym>Waypoint</sym><ele>2163.556</ele></wpt><wpt lat="40.035301" lon="-105.254443"><name><![CDATA[VICS]]></name><sym>Waypoint</sym><ele>1535.34</ele></wpt></gpx>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gpx'
|
3
|
+
|
4
|
+
class TestMagellanTrackLog < 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,57 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gpx'
|
3
|
+
|
4
|
+
class TestSegment < Test::Unit::TestCase
|
5
|
+
ONE_SEGMENT = File.join(File.dirname(__FILE__), "gpx_files/one_segment.gpx")
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@gpx_file = GPX::GPXFile.new(:gpx_file => ONE_SEGMENT)
|
9
|
+
@segment = @gpx_file.tracks.first.segments.first
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_segment_read
|
13
|
+
assert_equal(189, @segment.points.size)
|
14
|
+
assert_equal("Fri Apr 07 18:12:05 UTC 2006", @segment.earliest_point.time.to_s)
|
15
|
+
assert_equal("Fri Apr 07 19:26:31 UTC 2006", @segment.latest_point.time.to_s)
|
16
|
+
assert_equal(1334.447, @segment.lowest_point.elevation)
|
17
|
+
assert_equal(1480.087, @segment.highest_point.elevation)
|
18
|
+
assert_equal("6.98803359528853", @segment.distance.to_s)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_segment_crop
|
22
|
+
crop_rectangle = GPX::Bounds.new( :min_lat=> 39.173000,
|
23
|
+
:min_lon=> -109.010000,
|
24
|
+
:max_lat=> 39.188000,
|
25
|
+
:max_lon=> -108.999000)
|
26
|
+
@segment.crop(crop_rectangle)
|
27
|
+
|
28
|
+
assert_equal(106, @segment.points.size)
|
29
|
+
assert_equal("4.11422061733046", @segment.distance.to_s)
|
30
|
+
assert_equal("Fri Apr 07 18:37:21 UTC 2006", @segment.earliest_point.time.to_s)
|
31
|
+
assert_equal("Fri Apr 07 19:22:32 UTC 2006", @segment.latest_point.time.to_s)
|
32
|
+
assert_equal(1407.027, @segment.lowest_point.elevation)
|
33
|
+
assert_equal(1480.087, @segment.highest_point.elevation)
|
34
|
+
assert_equal(39.173834, @segment.bounds.min_lat)
|
35
|
+
assert_equal(-109.009995, @segment.bounds.min_lon)
|
36
|
+
assert_equal(39.187868, @segment.bounds.max_lat)
|
37
|
+
assert_equal(-108.999546, @segment.bounds.max_lon)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_segment_delete
|
41
|
+
delete_rectangle = GPX::Bounds.new( :min_lat=> 39.173000,
|
42
|
+
:min_lon=> -109.010000,
|
43
|
+
:max_lat=> 39.188000,
|
44
|
+
:max_lon=> -108.999000)
|
45
|
+
@segment.delete_area(delete_rectangle)
|
46
|
+
assert_equal(83, @segment.points.size)
|
47
|
+
assert_equal("3.35967118153605", @segment.distance.to_s)
|
48
|
+
assert_equal("Fri Apr 07 18:12:05 UTC 2006", @segment.earliest_point.time.to_s)
|
49
|
+
assert_equal("Fri Apr 07 19:26:31 UTC 2006", @segment.latest_point.time.to_s)
|
50
|
+
assert_equal(1334.447, @segment.lowest_point.elevation)
|
51
|
+
assert_equal(1428.176, @segment.highest_point.elevation)
|
52
|
+
assert_equal(39.180572, @segment.bounds.min_lat)
|
53
|
+
assert_equal(-109.016604, @segment.bounds.min_lon)
|
54
|
+
assert_equal(39.188747, @segment.bounds.max_lat)
|
55
|
+
assert_equal(-109.007978, @segment.bounds.max_lon)
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gpx'
|
3
|
+
|
4
|
+
class TestTrackFile < 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("myoutput.gpx")
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/tests/track_test.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gpx'
|
3
|
+
|
4
|
+
class TestTrack < 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( 364, @track.points.size)
|
15
|
+
assert_equal(8, @track.segments.size)
|
16
|
+
assert_equal("3.07249668492626", @track.distance.to_s)
|
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_equal("1.62136024923607", @track.distance.to_s)
|
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
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: gpx
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: "0.1"
|
7
|
+
date: 2006-10-14 00:00:00 -06:00
|
8
|
+
summary: A basic API for reading and writing GPX files.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: doug.fales@gmail.com
|
12
|
+
homepage: http://gpx.rubyforge.com/
|
13
|
+
rubyforge_project:
|
14
|
+
description: A basic API for reading and writing GPX files.
|
15
|
+
autorequire: gpx
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
authors:
|
29
|
+
- Doug Fales
|
30
|
+
files:
|
31
|
+
- lib/gpx
|
32
|
+
- lib/gpx.rb
|
33
|
+
- lib/gpx/bounds.rb
|
34
|
+
- lib/gpx/gpx.rb
|
35
|
+
- lib/gpx/gpx_file.rb
|
36
|
+
- lib/gpx/magellan_track_log.rb
|
37
|
+
- lib/gpx/point.rb
|
38
|
+
- lib/gpx/route.rb
|
39
|
+
- lib/gpx/segment.rb
|
40
|
+
- lib/gpx/track.rb
|
41
|
+
- lib/gpx/trackpoint.rb
|
42
|
+
- lib/gpx/waypoint.rb
|
43
|
+
- tests/gpx_files
|
44
|
+
- tests/magellan_test.rb
|
45
|
+
- tests/segment_test.rb
|
46
|
+
- tests/track_file_test.rb
|
47
|
+
- tests/track_test.rb
|
48
|
+
- tests/gpx_files/arches.gpx
|
49
|
+
- tests/gpx_files/magellan_track.log
|
50
|
+
- tests/gpx_files/one_segment.gpx
|
51
|
+
- tests/gpx_files/one_track.gpx
|
52
|
+
- tests/gpx_files/routes.gpx
|
53
|
+
- tests/gpx_files/tracks.gpx
|
54
|
+
- tests/gpx_files/waypoints.gpx
|
55
|
+
- Rakefile
|
56
|
+
- README
|
57
|
+
test_files: []
|
58
|
+
|
59
|
+
rdoc_options: []
|
60
|
+
|
61
|
+
extra_rdoc_files: []
|
62
|
+
|
63
|
+
executables: []
|
64
|
+
|
65
|
+
extensions: []
|
66
|
+
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
dependencies: []
|
70
|
+
|