gpx 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/lib/gpx.rb +2 -1
- data/lib/gpx/bounds.rb +5 -5
- data/lib/gpx/gpx.rb +5 -5
- data/lib/gpx/gpx_file.rb +57 -37
- data/lib/gpx/point.rb +17 -14
- data/lib/gpx/route.rb +9 -9
- data/lib/gpx/segment.rb +17 -12
- data/lib/gpx/track.rb +10 -10
- data/lib/gpx/waypoint.rb +12 -12
- data/tests/gpx10_test.rb +12 -0
- data/tests/gpx_files/gpx10.gpx +17 -0
- data/tests/segment_test.rb +1 -0
- metadata +11 -8
data/README
CHANGED
@@ -33,7 +33,7 @@ work-in-progress than an attempt at full GPX compliance. The track side of the
|
|
33
33
|
library has seen much more use than the route/waypoint side, so if you're doing
|
34
34
|
something with routes or waypoints, you may need to tweak some things.
|
35
35
|
|
36
|
-
Since this code uses
|
36
|
+
Since this code uses XML to read an entire GPX file into memory, it is not
|
37
37
|
the fastest possible solution for working with GPX data, especially if you are
|
38
38
|
working with tracks from several days or weeks.
|
39
39
|
|
data/lib/gpx.rb
CHANGED
data/lib/gpx/bounds.rb
CHANGED
@@ -44,11 +44,11 @@ module GPX
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def to_xml
|
47
|
-
bnd =
|
48
|
-
bnd
|
49
|
-
bnd
|
50
|
-
bnd
|
51
|
-
bnd
|
47
|
+
bnd = XML::Node.new('bounds')
|
48
|
+
bnd['minlat'] = min_lat.to_s
|
49
|
+
bnd['minlon'] = min_lon.to_s
|
50
|
+
bnd['maxlat'] = max_lat.to_s
|
51
|
+
bnd['maxlon'] = max_lon.to_s
|
52
52
|
bnd
|
53
53
|
end
|
54
54
|
|
data/lib/gpx/gpx.rb
CHANGED
@@ -21,14 +21,14 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
module GPX
|
24
|
-
VERSION = "0.
|
24
|
+
VERSION = "0.2"
|
25
25
|
|
26
26
|
# A common base class which provides a useful initializer method to many
|
27
27
|
# class in the GPX library.
|
28
28
|
class Base
|
29
|
-
include
|
29
|
+
include XML
|
30
30
|
|
31
|
-
# This initializer can take
|
31
|
+
# This initializer can take an XML::Node and scrape out any text
|
32
32
|
# elements with the names given in the "text_elements" array. Each
|
33
33
|
# element found underneath "parent" with a name in "text_elements" causes
|
34
34
|
# an attribute to be initialized on the instance. This means you don't
|
@@ -37,8 +37,8 @@ module GPX
|
|
37
37
|
# attributes to this method.
|
38
38
|
def instantiate_with_text_elements(parent, text_elements)
|
39
39
|
text_elements.each do |el|
|
40
|
-
unless parent.
|
41
|
-
val = parent.
|
40
|
+
unless parent.find(el).empty?
|
41
|
+
val = parent.find(el).first.content
|
42
42
|
code = <<-code
|
43
43
|
attr_accessor #{ el }
|
44
44
|
#{el}=#{val}
|
data/lib/gpx/gpx_file.rb
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
#++
|
23
23
|
module GPX
|
24
24
|
class GPXFile < Base
|
25
|
-
attr_reader :tracks, :routes, :waypoints, :bounds, :lowest_point, :highest_point, :distance, :duration, :average_speed
|
25
|
+
attr_reader :tracks, :routes, :waypoints, :bounds, :lowest_point, :highest_point, :distance, :duration, :average_speed, :ns
|
26
26
|
|
27
27
|
|
28
28
|
# This initializer can be used to create a new GPXFile from an existing
|
@@ -44,30 +44,41 @@ module GPX
|
|
44
44
|
@duration = 0
|
45
45
|
if(opts[:gpx_file])
|
46
46
|
gpx_file = opts[:gpx_file]
|
47
|
-
case gpx_file
|
48
|
-
when String
|
49
|
-
|
50
|
-
end
|
47
|
+
#case gpx_file
|
48
|
+
#when String
|
49
|
+
# gpx_file = File.open(gpx_file)
|
50
|
+
#end
|
51
|
+
gpx_file = gpx_file.name if gpx_file.is_a?(File)
|
51
52
|
reset_meta_data
|
52
|
-
@xml = Document.
|
53
|
-
|
54
|
-
|
53
|
+
@xml = XML::Document.file(gpx_file)
|
54
|
+
|
55
|
+
# set XML namespace for XML find
|
56
|
+
if @xml.root.namespace_node
|
57
|
+
@ns = 'gpx:' + @xml.root.namespace_node.href
|
58
|
+
else
|
59
|
+
@ns = 'gpx:http://www.topografix.com/GPX/1/1' # default to GPX 1.1
|
60
|
+
end
|
61
|
+
|
62
|
+
bounds_element = (@xml.find("//gpx:gpx/gpx:metadata/gpx:bounds", @ns).to_a.first rescue nil)
|
55
63
|
if bounds_element
|
56
|
-
@bounds.min_lat = bounds_element
|
57
|
-
@bounds.min_lon = bounds_element
|
58
|
-
@bounds.max_lat = bounds_element
|
59
|
-
@bounds.max_lon = bounds_element
|
64
|
+
@bounds.min_lat = get_bounds_attr_value(bounds_element, %w{ min_lat minlat minLat })
|
65
|
+
@bounds.min_lon = get_bounds_attr_value(bounds_element, %w{ min_lon minlon minLon})
|
66
|
+
@bounds.max_lat = get_bounds_attr_value(bounds_element, %w{ max_lat maxlat maxLat})
|
67
|
+
@bounds.max_lon = get_bounds_attr_value(bounds_element, %w{ max_lon maxlon maxLon})
|
60
68
|
else
|
61
69
|
get_bounds = true
|
62
70
|
end
|
63
|
-
|
64
|
-
@tracks =
|
71
|
+
|
72
|
+
@tracks = []
|
73
|
+
@xml.find("//gpx:gpx/gpx:trk", @ns).each do |trk|
|
65
74
|
trk = Track.new(:element => trk, :gpx_file => self)
|
66
75
|
update_meta_data(trk, get_bounds)
|
67
|
-
trk
|
76
|
+
@tracks << trk
|
68
77
|
end
|
69
|
-
@waypoints =
|
70
|
-
@
|
78
|
+
@waypoints = []
|
79
|
+
@xml.find("//gpx:gpx/gpx:wpt", @ns).each { |wpt| @waypoints << Waypoint.new(:element => wpt, :gpx_file => self) }
|
80
|
+
@routes = []
|
81
|
+
@xml.find("//gpx:gpx/gpx:rte", @ns).each { |rte| @routes << Route.new(:element => rte, :gpx_file => self) }
|
71
82
|
|
72
83
|
@tracks.delete_if { |t| t.empty? }
|
73
84
|
|
@@ -82,6 +93,15 @@ module GPX
|
|
82
93
|
end
|
83
94
|
end
|
84
95
|
|
96
|
+
def get_bounds_attr_value(el, possible_names)
|
97
|
+
result = nil
|
98
|
+
possible_names.each do |name|
|
99
|
+
result = el[name]
|
100
|
+
break unless result.nil?
|
101
|
+
end
|
102
|
+
return (result.to_f rescue nil)
|
103
|
+
end
|
104
|
+
|
85
105
|
# Returns the distance, in kilometers, meters, or miles, of all of the
|
86
106
|
# tracks and segments contained in this GPXFile.
|
87
107
|
def distance(opts = { :units => 'kilometers' })
|
@@ -175,32 +195,32 @@ module GPX
|
|
175
195
|
def write(filename)
|
176
196
|
|
177
197
|
doc = Document.new
|
178
|
-
|
179
|
-
doc.
|
180
|
-
gpx_elem
|
181
|
-
gpx_elem
|
182
|
-
gpx_elem
|
183
|
-
gpx_elem
|
184
|
-
gpx_elem
|
198
|
+
doc.root = Node.new('gpx')
|
199
|
+
gpx_elem = doc.root
|
200
|
+
gpx_elem['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance"
|
201
|
+
gpx_elem['xmlns'] = "http://www.topografix.com/GPX/1/1"
|
202
|
+
gpx_elem['version'] = "1.1"
|
203
|
+
gpx_elem['creator'] = "GPX RubyGem 0.1 Copyright 2006 Doug Fales -- http://walkingboss.com"
|
204
|
+
gpx_elem['xsi:schemaLocation'] = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
|
185
205
|
|
186
|
-
meta_data_elem =
|
187
|
-
name_elem =
|
188
|
-
name_elem
|
189
|
-
meta_data_elem
|
206
|
+
meta_data_elem = Node.new('metadata')
|
207
|
+
name_elem = Node.new('name')
|
208
|
+
name_elem << File.basename(filename)
|
209
|
+
meta_data_elem << name_elem
|
190
210
|
|
191
|
-
time_elem =
|
192
|
-
time_elem
|
193
|
-
meta_data_elem
|
211
|
+
time_elem = Node.new('time')
|
212
|
+
time_elem << Time.now.xmlschema
|
213
|
+
meta_data_elem << time_elem
|
194
214
|
|
195
|
-
meta_data_elem
|
215
|
+
meta_data_elem << bounds.to_xml
|
196
216
|
|
197
|
-
gpx_elem
|
217
|
+
gpx_elem << meta_data_elem
|
198
218
|
|
199
|
-
tracks.each { |t|
|
200
|
-
waypoints.each { |w| gpx_elem
|
201
|
-
routes.each { |r| gpx_elem
|
219
|
+
tracks.each { |t| gpx_elem << t.to_xml } unless tracks.nil?
|
220
|
+
waypoints.each { |w| gpx_elem << w.to_xml } unless waypoints.nil?
|
221
|
+
routes.each { |r| gpx_elem << r.to_xml } unless routes.nil?
|
202
222
|
|
203
|
-
|
223
|
+
doc.save(filename, true)
|
204
224
|
end
|
205
225
|
|
206
226
|
private
|
data/lib/gpx/point.rb
CHANGED
@@ -29,16 +29,17 @@ module GPX
|
|
29
29
|
|
30
30
|
# When you need to manipulate individual points, you can create a Point
|
31
31
|
# object with a latitude, a longitude, an elevation, and a time. In
|
32
|
-
# addition, you can pass
|
32
|
+
# addition, you can pass an XML element to this initializer, and the
|
33
33
|
# relevant info will be parsed out.
|
34
34
|
def initialize(opts = {:lat => 0.0, :lon => 0.0, :elevation => 0.0, :time => Time.now } )
|
35
|
+
@gpx_file = opts[:gpx_file]
|
35
36
|
if (opts[:element])
|
36
37
|
elem = opts[:element]
|
37
|
-
@lat, @lon = elem
|
38
|
+
@lat, @lon = elem["lat"].to_f, elem["lon"].to_f
|
38
39
|
@latr, @lonr = (D_TO_R * @lat), (D_TO_R * @lon)
|
39
40
|
#'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
|
40
|
-
@time = (Time.xmlschema(elem.
|
41
|
-
@elevation = elem.
|
41
|
+
@time = (Time.xmlschema(elem.find("gpx:time", @gpx_file.ns).first.content) rescue nil)
|
42
|
+
@elevation = elem.find("gpx:ele", @gpx_file.ns).first.content.to_f unless elem.find("gpx:ele", @gpx_file.ns).empty?
|
42
43
|
else
|
43
44
|
@lat = opts[:lat]
|
44
45
|
@lon = opts[:lon]
|
@@ -85,17 +86,19 @@ module GPX
|
|
85
86
|
@lon = longitude
|
86
87
|
end
|
87
88
|
|
88
|
-
# Convert this point to a
|
89
|
+
# Convert this point to a XML::Node.
|
89
90
|
def to_xml(elem_name = 'trkpt')
|
90
|
-
pt =
|
91
|
-
pt
|
92
|
-
pt
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
91
|
+
pt = Node.new('trkpt')
|
92
|
+
pt['lat'] = lat.to_s
|
93
|
+
pt['lon'] = lon.to_s
|
94
|
+
unless time.nil?
|
95
|
+
time_elem = Node.new('time')
|
96
|
+
time_elem << time.xmlschema
|
97
|
+
pt << time_elem
|
98
|
+
end
|
99
|
+
elev = Node.new('ele')
|
100
|
+
elev << elevation
|
101
|
+
pt << elev
|
99
102
|
pt
|
100
103
|
end
|
101
104
|
|
data/lib/gpx/route.rb
CHANGED
@@ -29,13 +29,13 @@ module GPX
|
|
29
29
|
|
30
30
|
attr_reader :points, :name, :gpx_file
|
31
31
|
|
32
|
-
# Initialize a Route from a
|
32
|
+
# Initialize a Route from a XML::Node.
|
33
33
|
def initialize(opts = {})
|
34
34
|
rte_element = opts[:element]
|
35
35
|
@gpx_file = opts[:gpx_file]
|
36
|
-
@name = rte_element.
|
36
|
+
@name = rte_element.find("child::gpx:name", @ns).first.content
|
37
37
|
@points = []
|
38
|
-
|
38
|
+
rte_element.find("child::gpx:rtept", @ns).each do |point|
|
39
39
|
@points << Point.new(:element => point)
|
40
40
|
end
|
41
41
|
|
@@ -51,13 +51,13 @@ module GPX
|
|
51
51
|
points.delete_if{ |pt| area.contains? pt }
|
52
52
|
end
|
53
53
|
|
54
|
-
# Convert this Route to a
|
54
|
+
# Convert this Route to a XML::Node.
|
55
55
|
def to_xml
|
56
|
-
rte =
|
57
|
-
name_elem =
|
58
|
-
name_elem
|
59
|
-
rte
|
60
|
-
points.each { |rte_pt| rte
|
56
|
+
rte = Node.new('rte')
|
57
|
+
name_elem = Node.new('name')
|
58
|
+
name_elem << name
|
59
|
+
rte << name_elem
|
60
|
+
points.each { |rte_pt| rte << rte_pt.to_xml('rtept') }
|
61
61
|
rte
|
62
62
|
end
|
63
63
|
|
data/lib/gpx/segment.rb
CHANGED
@@ -31,9 +31,10 @@ module GPX
|
|
31
31
|
attr_reader :earliest_point, :latest_point, :bounds, :highest_point, :lowest_point, :distance
|
32
32
|
attr_accessor :points, :track
|
33
33
|
|
34
|
-
# If a
|
34
|
+
# If a XML::Node object is passed-in, this will initialize a new
|
35
35
|
# Segment based on its contents. Otherwise, a blank Segment is created.
|
36
36
|
def initialize(opts = {})
|
37
|
+
@gpx_file = opts[:gpx_file]
|
37
38
|
@track = opts[:track]
|
38
39
|
@points = []
|
39
40
|
@earliest_point = nil
|
@@ -45,11 +46,13 @@ module GPX
|
|
45
46
|
if(opts[:element])
|
46
47
|
segment_element = opts[:element]
|
47
48
|
last_pt = nil
|
48
|
-
|
49
|
-
|
50
|
-
pt = TrackPoint.new(:element => trkpt, :segment => self)
|
51
|
-
|
52
|
-
|
49
|
+
if segment_element.is_a?(XML::Node)
|
50
|
+
segment_element.find("child::gpx:trkpt", @gpx_file.ns).each do |trkpt|
|
51
|
+
pt = TrackPoint.new(:element => trkpt, :segment => self, :gpx_file => @gpx_file)
|
52
|
+
unless pt.time.nil?
|
53
|
+
@earliest_point = pt if(@earliest_point.nil? or pt.time < @earliest_point.time)
|
54
|
+
@latest_point = pt if(@latest_point.nil? or pt.time > @latest_point.time)
|
55
|
+
end
|
53
56
|
unless pt.elevation.nil?
|
54
57
|
@lowest_point = pt if(@lowest_point.nil? or pt.elevation < @lowest_point.elevation)
|
55
58
|
@highest_point = pt if(@highest_point.nil? or pt.elevation > @highest_point.elevation)
|
@@ -85,7 +88,7 @@ module GPX
|
|
85
88
|
|
86
89
|
# Returns true if the given time is within this Segment.
|
87
90
|
def contains_time?(time)
|
88
|
-
(time >= @earliest_point.time and time <= @latest_point.time)
|
91
|
+
(time >= @earliest_point.time and time <= @latest_point.time) rescue false
|
89
92
|
end
|
90
93
|
|
91
94
|
# Finds the closest point in time to the passed-in time argument. Useful
|
@@ -129,10 +132,10 @@ module GPX
|
|
129
132
|
(points.nil? or (points.size == 0))
|
130
133
|
end
|
131
134
|
|
132
|
-
# Converts this Segment to a
|
135
|
+
# Converts this Segment to a XML::Node object.
|
133
136
|
def to_xml
|
134
|
-
seg =
|
135
|
-
points.each { |pt| seg
|
137
|
+
seg = Node.new('trkseg')
|
138
|
+
points.each { |pt| seg << pt.to_xml }
|
136
139
|
seg
|
137
140
|
end
|
138
141
|
|
@@ -202,8 +205,10 @@ module GPX
|
|
202
205
|
end
|
203
206
|
|
204
207
|
def update_meta_data(pt, last_pt)
|
205
|
-
|
206
|
-
|
208
|
+
unless pt.time.nil?
|
209
|
+
@earliest_point = pt if(@earliest_point.nil? or pt.time < @earliest_point.time)
|
210
|
+
@latest_point = pt if(@latest_point.nil? or pt.time > @latest_point.time)
|
211
|
+
end
|
207
212
|
unless pt.elevation.nil?
|
208
213
|
@lowest_point = pt if(@lowest_point.nil? or pt.elevation < @lowest_point.elevation)
|
209
214
|
@highest_point = pt if(@highest_point.nil? or pt.elevation > @highest_point.elevation)
|
data/lib/gpx/track.rb
CHANGED
@@ -32,7 +32,7 @@ module GPX
|
|
32
32
|
attr_reader :points, :bounds, :lowest_point, :highest_point, :distance
|
33
33
|
attr_accessor :segments, :name, :gpx_file
|
34
34
|
|
35
|
-
# Initialize a track from a
|
35
|
+
# Initialize a track from a XML::Node, or, if no :element option is
|
36
36
|
# passed, initialize a blank Track object.
|
37
37
|
def initialize(opts = {})
|
38
38
|
@gpx_file = opts[:gpx_file]
|
@@ -41,9 +41,9 @@ module GPX
|
|
41
41
|
reset_meta_data
|
42
42
|
if(opts[:element])
|
43
43
|
trk_element = opts[:element]
|
44
|
-
@name = (trk_element.
|
45
|
-
|
46
|
-
seg = Segment.new(:element => seg_element, :track => self)
|
44
|
+
@name = (trk_element.find("child::gpx:name", @gpx_file.ns).first.content rescue "")
|
45
|
+
trk_element.find("child::gpx:trkseg", @gpx_file.ns).each do |seg_element|
|
46
|
+
seg = Segment.new(:element => seg_element, :track => self, :gpx_file => @gpx_file)
|
47
47
|
update_meta_data(seg)
|
48
48
|
@segments << seg
|
49
49
|
@points.concat(seg.points) unless seg.nil?
|
@@ -101,14 +101,14 @@ module GPX
|
|
101
101
|
(points.nil? or points.size.zero?)
|
102
102
|
end
|
103
103
|
|
104
|
-
# Creates a new
|
104
|
+
# Creates a new XML::Node from the contents of this instance.
|
105
105
|
def to_xml
|
106
|
-
trk=
|
107
|
-
name_elem =
|
108
|
-
name_elem
|
109
|
-
trk
|
106
|
+
trk= Node.new('trk')
|
107
|
+
name_elem = Node.new('name')
|
108
|
+
name_elem << name
|
109
|
+
trk << name_elem
|
110
110
|
segments.each do |seg|
|
111
|
-
trk
|
111
|
+
trk << seg.to_xml
|
112
112
|
end
|
113
113
|
trk
|
114
114
|
end
|
data/lib/gpx/waypoint.rb
CHANGED
@@ -39,7 +39,7 @@ module GPX
|
|
39
39
|
def delete_area(area)
|
40
40
|
end
|
41
41
|
|
42
|
-
# Initializes a waypoint from a
|
42
|
+
# Initializes a waypoint from a XML::Node.
|
43
43
|
def initialize(opts = {})
|
44
44
|
wpt_elem = opts[:element]
|
45
45
|
super(:element => wpt_elem)
|
@@ -47,25 +47,25 @@ module GPX
|
|
47
47
|
@gpx_file = opts[:gpx_file]
|
48
48
|
end
|
49
49
|
|
50
|
-
# Converts a waypoint to a
|
50
|
+
# Converts a waypoint to a XML::Node.
|
51
51
|
def to_xml
|
52
|
-
wpt =
|
52
|
+
wpt = Node.new('wpt')
|
53
53
|
wpt.attributes['lat'] = lat
|
54
54
|
wpt.attributes['lon'] = lon
|
55
55
|
if self.respond_to? :name
|
56
|
-
name_elem =
|
57
|
-
name_elem
|
58
|
-
wpt
|
56
|
+
name_elem = Node.new('name')
|
57
|
+
name_elem << self.name
|
58
|
+
wpt << name_elem
|
59
59
|
end
|
60
60
|
if self.respond_to? :sym
|
61
|
-
sym_elem =
|
62
|
-
sym_elem
|
63
|
-
wpt
|
61
|
+
sym_elem = Node.new('sym')
|
62
|
+
sym_elem << self.sym
|
63
|
+
wpt << sym_elem
|
64
64
|
end
|
65
65
|
if self.respond_to? :ele
|
66
|
-
elev_elem =
|
67
|
-
elev_elem
|
68
|
-
wpt
|
66
|
+
elev_elem = Node.new('ele')
|
67
|
+
elev_elem << self.ele
|
68
|
+
wpt << elev_elem
|
69
69
|
end
|
70
70
|
wpt
|
71
71
|
end
|
data/tests/gpx10_test.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gpx'
|
3
|
+
|
4
|
+
class TestGPX10 < Test::Unit::TestCase
|
5
|
+
GPX_FILE = File.join(File.dirname(__FILE__), "gpx_files/gpx10.gpx")
|
6
|
+
|
7
|
+
def test_read
|
8
|
+
# make sure we can read a GPX 1.0 file
|
9
|
+
@gpx_file = GPX::GPXFile.new(:gpx_file => GPX_FILE)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<gpx version="1.0"
|
3
|
+
creator="GPSBabel - http://www.gpsbabel.org"
|
4
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
5
|
+
xmlns="http://www.topografix.com/GPX/1/0"
|
6
|
+
xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
|
7
|
+
<trk>
|
8
|
+
<name>ACTIVE LOG #74</name>
|
9
|
+
<number>82</number>
|
10
|
+
<trkseg>
|
11
|
+
<trkpt lat="37.378388923" lon="-122.063654875">
|
12
|
+
<ele>35.706055</ele>
|
13
|
+
<time>2007-11-23T23:49:43Z</time>
|
14
|
+
</trkpt>
|
15
|
+
</trkseg>
|
16
|
+
</trk>
|
17
|
+
</gpx>
|
data/tests/segment_test.rb
CHANGED
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: gpx
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
date:
|
6
|
+
version: "0.2"
|
7
|
+
date: 2007-11-29 00:00:00 -07:00
|
8
8
|
summary: A basic API for reading and writing GPX files.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,11 +25,11 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Doug Fales
|
30
31
|
files:
|
31
32
|
- lib/gpx
|
32
|
-
- lib/gpx.rb
|
33
33
|
- lib/gpx/bounds.rb
|
34
34
|
- lib/gpx/gpx.rb
|
35
35
|
- lib/gpx/gpx_file.rb
|
@@ -40,18 +40,21 @@ files:
|
|
40
40
|
- lib/gpx/track.rb
|
41
41
|
- lib/gpx/trackpoint.rb
|
42
42
|
- lib/gpx/waypoint.rb
|
43
|
+
- lib/gpx.rb
|
44
|
+
- tests/gpx10_test.rb
|
43
45
|
- 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
46
|
- tests/gpx_files/arches.gpx
|
47
|
+
- tests/gpx_files/gpx10.gpx
|
49
48
|
- tests/gpx_files/magellan_track.log
|
50
49
|
- tests/gpx_files/one_segment.gpx
|
51
50
|
- tests/gpx_files/one_track.gpx
|
52
51
|
- tests/gpx_files/routes.gpx
|
53
52
|
- tests/gpx_files/tracks.gpx
|
54
53
|
- tests/gpx_files/waypoints.gpx
|
54
|
+
- tests/magellan_test.rb
|
55
|
+
- tests/segment_test.rb
|
56
|
+
- tests/track_file_test.rb
|
57
|
+
- tests/track_test.rb
|
55
58
|
- Rakefile
|
56
59
|
- README
|
57
60
|
test_files: []
|