gpx 0.5 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +44 -116
- data/{README → README.rdoc} +5 -2
- data/Rakefile +0 -29
- data/lib/gpx/gpx.rb +1 -1
- data/lib/gpx/gpx_file.rb +37 -21
- data/lib/gpx/waypoint.rb +60 -60
- data/tests/output/myoutput.gpx +755 -0
- data/tests/output/new_gpx_file_from_scratch.gpx +2 -2
- data/tests/output_test.rb +19 -14
- data/tests/track_file_test.rb +1 -1
- metadata +17 -10
data/ChangeLog
CHANGED
@@ -1,132 +1,60 @@
|
|
1
|
-
|
1
|
+
2010-02-27 Doug Fales <doug@falesafeconsulting.com>
|
2
|
+
* Putting the gem building stuff into a gemspec.
|
3
|
+
* Fixing some tests since git does not believe in empty directories.
|
4
|
+
* Fixing README formatting.
|
2
5
|
|
3
|
-
|
6
|
+
2010-02-27 Doug Fales <doug@falesafeconsulting.com>
|
7
|
+
* README edits.
|
8
|
+
* More rdoc tweaks.
|
9
|
+
* Changing README to rdoc ext for github.
|
4
10
|
|
5
|
-
2009-
|
11
|
+
2009-10-13 Doug Fales <doug@falesafeconsulting.com>
|
12
|
+
* Adding the ability to write GPX to a string in addition to a file. Thanks to Douglas Robertson for the patch.
|
6
13
|
|
7
|
-
|
14
|
+
2009-09-27 Doug Fales <doug@falesafeconsulting.com>
|
15
|
+
* Adding a patch from Douglas Robertson that allows using version 1.0 of the schema for output.
|
8
16
|
|
9
|
-
2009-07-07
|
17
|
+
2009-07-07 Doug Fales <doug@falesafeconsulting.com>
|
18
|
+
* Adding changelog.
|
19
|
+
* Revving to version 0.5.
|
20
|
+
* Changing my contact email address.
|
21
|
+
* Patches from Tom Verbeure (mtbguru.com) to work with libxml-ruby 1.x.
|
10
22
|
|
11
|
-
|
12
|
-
|
13
|
-
Verbeure (mtbguru.com) to work with libxml-ruby 1.x.
|
23
|
+
2009-06-17 Doug Fales <doug@falesafeconsulting.com>
|
24
|
+
* Patch from Kang-min Liu to support speed element.
|
14
25
|
|
15
|
-
|
26
|
+
2008-02-19 Doug Fales <doug@falesafeconsulting.com>
|
27
|
+
* Revving to 0.4.
|
28
|
+
* Adding some new unit tests and fixing several file export bugs reported by Jochen Topf. New unit tests also uncovered a bug where the number of trackpoints reported in a file was twice the actual number.
|
16
29
|
|
17
|
-
|
18
|
-
|
30
|
+
2008-02-11 Doug Fales <doug@falesafeconsulting.com>
|
31
|
+
* Going to version 0.3.
|
32
|
+
* Updating unit tests in light of recent fixes to routes and waypoints code.
|
19
33
|
|
20
|
-
2008-02-
|
34
|
+
2008-02-08 Doug Fales <doug@falesafeconsulting.com>
|
35
|
+
* Thanks to Mike Gauland for discovering some route- and waypoint-related bugs. I've fixed them and also added #to_s on Waypoint so it's easier to debug.
|
21
36
|
|
22
|
-
|
37
|
+
2007-12-04 Doug Fales <doug@falesafeconsulting.com>
|
38
|
+
* Thanks to Christian Koerner for finding and fixing these bugs in the waypoint code.
|
39
|
+
* Another patch from Gaku Ueda. This one allows you to pass in a string of GPX data using the :gpx_date => option. Thanks Gaku!
|
23
40
|
|
24
|
-
|
41
|
+
2007-11-30 Doug Fales <doug@falesafeconsulting.com>
|
42
|
+
* Updating the version #.
|
43
|
+
* Updates courtesy of Gaku Ueda: * Adding support for GPX 1.0 as well as 1.1 (since libxml namespace parsing was hard-coded to 1.1. previously). * Adding a GPX 1.0 unit test file. * Miscellaneous updates to make it work with Ruby 1.8.6.
|
25
44
|
|
26
|
-
|
27
|
-
|
28
|
-
tests/gpx_file_test.rb, tests/gpx_files, tests/gpx_files/big.gpx,
|
29
|
-
tests/output, tests/output_test.rb, tests/track_test.rb: Adding
|
30
|
-
some new unit tests and fixing several file export bugs reported
|
31
|
-
by Jochen Topf.
|
32
|
-
New unit tests also uncovered a bug where the number of
|
33
|
-
trackpoints reported in a file was twice the actual number.
|
45
|
+
2006-12-04 Doug Fales <doug@falesafeconsulting.com>
|
46
|
+
* First stab at using libxml-ruby instead of REXML. I'm seeing the unit tests finish in under 14 seconds. That is compared to 2 minutes using REXML.
|
34
47
|
|
35
|
-
|
48
|
+
2006-12-03 Doug Fales <doug@falesafeconsulting.com>
|
49
|
+
* Fixing more nil time exceptions.
|
50
|
+
* Fixing an exception in contains_time?.
|
36
51
|
|
37
|
-
|
52
|
+
2006-11-28 Doug Fales <doug@falesafeconsulting.com>
|
53
|
+
* A couple of fixes to make the library comply with the different attribute names possible on the bounds element.
|
38
54
|
|
39
|
-
|
55
|
+
2006-10-28 Doug Fales <doug@falesafeconsulting.com>
|
56
|
+
* Fixing nil time bug.
|
40
57
|
|
41
|
-
|
42
|
-
|
43
|
-
tests/route_test.rb, tests/segment_test.rb,
|
44
|
-
tests/track_file_test.rb, tests/track_test.rb,
|
45
|
-
tests/waypoint_test.rb: Updating unit tests in light of recent
|
46
|
-
fixes to routes and waypoints code.
|
47
|
-
|
48
|
-
2008-02-08 23:26 dougfales
|
49
|
-
|
50
|
-
* lib/gpx/gpx.rb, lib/gpx/point.rb, lib/gpx/route.rb,
|
51
|
-
lib/gpx/waypoint.rb: Thanks to Mike Gauland for discovering some
|
52
|
-
route- and waypoint-related bugs. I've fixed them and also added
|
53
|
-
#to_s on Waypoint so it's easier to debug.
|
54
|
-
|
55
|
-
2007-12-04 17:58 dougfales
|
56
|
-
|
57
|
-
* lib/gpx/waypoint.rb: Thanks to Christian Koerner for finding and
|
58
|
-
fixing these bugs in the waypoint
|
59
|
-
code.
|
60
|
-
|
61
|
-
2007-12-04 17:52 dougfales
|
62
|
-
|
63
|
-
* lib/gpx/gpx_file.rb, tests/gpx_file_test.rb: Another patch from
|
64
|
-
Gaku Ueda. This one allows you to pass in a string of GPX
|
65
|
-
data using the :gpx_date => option. Thanks Gaku!
|
66
|
-
|
67
|
-
2007-11-30 06:29 dougfales
|
68
|
-
|
69
|
-
* lib/gpx/gpx.rb: Updating the version #.
|
70
|
-
|
71
|
-
2007-11-30 06:26 dougfales
|
72
|
-
|
73
|
-
* lib/gpx/gpx.rb, lib/gpx/gpx_file.rb, lib/gpx/point.rb,
|
74
|
-
lib/gpx/route.rb, lib/gpx/segment.rb, lib/gpx/track.rb,
|
75
|
-
tests/gpx10_test.rb, tests/gpx_files/gpx10.gpx: Updates courtesy
|
76
|
-
of Gaku Ueda:
|
77
|
-
* Adding support for GPX 1.0 as well as 1.1 (since libxml
|
78
|
-
namespace parsing
|
79
|
-
was hard-coded to 1.1. previously).
|
80
|
-
* Adding a GPX 1.0 unit test file.
|
81
|
-
* Miscellaneous updates to make it work with Ruby 1.8.6.
|
82
|
-
|
83
|
-
2006-12-04 06:47 dougfales
|
84
|
-
|
85
|
-
* README, lib/gpx.rb, lib/gpx/bounds.rb, lib/gpx/gpx.rb,
|
86
|
-
lib/gpx/gpx_file.rb, lib/gpx/point.rb, lib/gpx/route.rb,
|
87
|
-
lib/gpx/segment.rb, lib/gpx/track.rb, lib/gpx/waypoint.rb,
|
88
|
-
tests/segment_test.rb: First stab at using libxml-ruby instead of
|
89
|
-
REXML. I'm seeing the unit tests
|
90
|
-
finish in under 14 seconds. That is compared to 2 minutes using
|
91
|
-
REXML.
|
92
|
-
|
93
|
-
2006-12-03 07:31 dougfales
|
94
|
-
|
95
|
-
* lib/gpx/point.rb, lib/gpx/segment.rb: Fixing more nil time
|
96
|
-
exceptions.
|
97
|
-
|
98
|
-
2006-12-03 06:59 dougfales
|
99
|
-
|
100
|
-
* lib/gpx/segment.rb: Fixing an exception in contains_time?.
|
101
|
-
|
102
|
-
2006-11-28 15:35 dougfales
|
103
|
-
|
104
|
-
* lib/gpx/bounds.rb, lib/gpx/gpx_file.rb: A couple of fixes to make
|
105
|
-
the library comply with the different attribute names
|
106
|
-
possible on the bounds element.
|
107
|
-
|
108
|
-
Formerly, a bounds element with a minlat or minLat attribute
|
109
|
-
(instead of
|
110
|
-
min_lat) would not be properly parsed. Now all three styles of
|
111
|
-
attribute name
|
112
|
-
are accepted.
|
113
|
-
|
114
|
-
2006-10-28 22:09 dougfales
|
115
|
-
|
116
|
-
* lib/gpx/segment.rb: Fixing nil time bug.
|
117
|
-
|
118
|
-
2006-10-14 13:20 dougfales
|
119
|
-
|
120
|
-
* ., README, Rakefile, bin, docs, lib, lib/gpx, lib/gpx.rb,
|
121
|
-
lib/gpx/bounds.rb, lib/gpx/gpx.rb, lib/gpx/gpx_file.rb,
|
122
|
-
lib/gpx/magellan_track_log.rb, lib/gpx/point.rb,
|
123
|
-
lib/gpx/route.rb, lib/gpx/segment.rb, lib/gpx/track.rb,
|
124
|
-
lib/gpx/trackpoint.rb, lib/gpx/waypoint.rb, tests,
|
125
|
-
tests/gpx_files, tests/gpx_files/arches.gpx,
|
126
|
-
tests/gpx_files/magellan_track.log,
|
127
|
-
tests/gpx_files/one_segment.gpx, tests/gpx_files/one_track.gpx,
|
128
|
-
tests/gpx_files/routes.gpx, tests/gpx_files/tracks.gpx,
|
129
|
-
tests/gpx_files/waypoints.gpx, tests/magellan_test.rb,
|
130
|
-
tests/segment_test.rb, tests/track_file_test.rb,
|
131
|
-
tests/track_test.rb: Initial import of gpx gem.
|
58
|
+
2006-10-14 Doug Fales <doug@falesafeconsulting.com>
|
59
|
+
* Initial import of gpx gem.
|
132
60
|
|
data/{README → README.rdoc}
RENAMED
@@ -1,8 +1,9 @@
|
|
1
1
|
= GPX Gem
|
2
|
-
|
3
|
-
Doug Fales mailto:doug@falesafeconsulting.com
|
2
|
+
|
3
|
+
Copyright (C) 2006 Doug Fales mailto:doug@falesafeconsulting.com
|
4
4
|
|
5
5
|
== What It Does
|
6
|
+
|
6
7
|
This library reads GPX files and provides an API for reading and manipulating
|
7
8
|
the data as objects. For more info on the GPX format, see
|
8
9
|
http://www.topografix.com/gpx.asp.
|
@@ -14,6 +15,7 @@ the tracks and points in a file (such as distance, duration, average speed,
|
|
14
15
|
etc).
|
15
16
|
|
16
17
|
== Examples
|
18
|
+
|
17
19
|
Reading a GPX file, and cropping its contents to a given area:
|
18
20
|
gpx = GPX::GPXFile.new(:gpx_file => filename) # Read GPX file
|
19
21
|
bounds = GPX::Bounds.new(params) # Create a rectangular area to crop
|
@@ -27,6 +29,7 @@ Converting a Magellan track log to GPX:
|
|
27
29
|
|
28
30
|
|
29
31
|
== Notes
|
32
|
+
|
30
33
|
This library was written to bridge the gap between my Garmin Geko
|
31
34
|
and my website, WalkingBoss.org (RIP). For that reason, it has always been more of a
|
32
35
|
work-in-progress than an attempt at full GPX compliance. The track side of the
|
data/Rakefile
CHANGED
@@ -42,35 +42,6 @@ Rake::RDocTask.new("doc") { |rdoc|
|
|
42
42
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
43
43
|
}
|
44
44
|
|
45
|
-
# Genereate the package
|
46
|
-
spec = Gem::Specification.new do |s|
|
47
|
-
|
48
|
-
s.name = 'gpx'
|
49
|
-
s.version = PKG_VERSION
|
50
|
-
s.summary = <<-EOF
|
51
|
-
A basic API for reading and writing GPX files.
|
52
|
-
EOF
|
53
|
-
s.description = <<-EOF
|
54
|
-
A basic API for reading and writing GPX files.
|
55
|
-
EOF
|
56
|
-
|
57
|
-
s.files = PKG_FILES
|
58
|
-
|
59
|
-
s.require_path = 'lib'
|
60
|
-
s.autorequire = 'gpx'
|
61
|
-
|
62
|
-
s.has_rdoc = true
|
63
|
-
|
64
|
-
s.author = "Doug Fales"
|
65
|
-
s.email = "doug.fales@gmail.com"
|
66
|
-
s.homepage = "http://gpx.rubyforge.com/"
|
67
|
-
end
|
68
|
-
|
69
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
70
|
-
pkg.need_zip = true
|
71
|
-
pkg.need_tar = true
|
72
|
-
end
|
73
|
-
|
74
45
|
desc "Report code statistics (KLOCs, etc) from the application"
|
75
46
|
task :stats do
|
76
47
|
require 'code_statistics'
|
data/lib/gpx/gpx.rb
CHANGED
data/lib/gpx/gpx_file.rb
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
#++
|
23
23
|
module GPX
|
24
24
|
class GPXFile < Base
|
25
|
-
attr_accessor :tracks, :routes, :waypoints, :bounds, :lowest_point, :highest_point, :duration, :ns, :time, :name
|
25
|
+
attr_accessor :tracks, :routes, :waypoints, :bounds, :lowest_point, :highest_point, :duration, :ns, :version, :time, :name
|
26
26
|
|
27
27
|
|
28
28
|
# This initializer can be used to create a new GPXFile from an existing
|
@@ -205,41 +205,57 @@ module GPX
|
|
205
205
|
# Serialize the current GPXFile to a gpx file named <filename>.
|
206
206
|
# If the file does not exist, it is created. If it does exist, it is overwritten.
|
207
207
|
def write(filename, update_time = true)
|
208
|
+
@time = Time.now if(@time.nil? or update_time)
|
209
|
+
@name ||= File.basename(filename)
|
210
|
+
doc = generate_xml_doc
|
211
|
+
doc.save(filename, :indent => true)
|
212
|
+
end
|
213
|
+
|
214
|
+
def to_s(update_time = true)
|
215
|
+
@time = Time.now if(@time.nil? or update_time)
|
216
|
+
doc = generate_xml_doc
|
217
|
+
doc.to_s
|
218
|
+
end
|
208
219
|
|
220
|
+
private
|
221
|
+
def generate_xml_doc
|
209
222
|
doc = Document.new
|
210
223
|
doc.root = Node.new('gpx')
|
211
224
|
gpx_elem = doc.root
|
212
|
-
gpx_elem['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance"
|
213
|
-
|
214
|
-
|
215
|
-
gpx_elem['
|
216
|
-
gpx_elem['
|
225
|
+
gpx_elem['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance"
|
226
|
+
@version = '1.1' if (@version.nil? || !(['1.0', '1.1'].include?(@version))) # default to version 1.1 of the schema (only version 1.0 and 1.1 of the schema exist)
|
227
|
+
version_dir = @version.gsub('.','/')
|
228
|
+
gpx_elem['xmlns'] = @ns || "http://www.topografix.com/GPX/#{version_dir}"
|
229
|
+
gpx_elem['version'] = "#{@version}"
|
230
|
+
gpx_elem['creator'] = "GPX RubyGem #{GPX::VERSION} Copyright 2006-2009 Doug Fales -- http://gpx.rubyforge.org/"
|
231
|
+
gpx_elem['xsi:schemaLocation'] = "http://www.topografix.com/GPX/#{version_dir} http://www.topografix.com/GPX/#{version_dir}/gpx.xsd"
|
217
232
|
|
218
|
-
|
233
|
+
# setup the metadata elements
|
219
234
|
name_elem = Node.new('name')
|
220
|
-
name_elem <<
|
221
|
-
meta_data_elem << name_elem
|
222
|
-
|
235
|
+
name_elem << @name
|
223
236
|
time_elem = Node.new('time')
|
237
|
+
time_elem << @time.xmlschema
|
224
238
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
239
|
+
# version 1.0 of the schema doesn't support the metadata element, so push them straight to the root 'gpx' element
|
240
|
+
if (@version == '1.0') then
|
241
|
+
gpx_elem << name_elem
|
242
|
+
gpx_elem << time_elem
|
243
|
+
gpx_elem << bounds.to_xml
|
244
|
+
else
|
245
|
+
meta_data_elem = Node.new('metadata')
|
246
|
+
meta_data_elem << name_elem
|
247
|
+
meta_data_elem << time_elem
|
248
|
+
meta_data_elem << bounds.to_xml
|
249
|
+
gpx_elem << meta_data_elem
|
250
|
+
end
|
233
251
|
|
234
252
|
tracks.each { |t| gpx_elem << t.to_xml } unless tracks.nil?
|
235
253
|
waypoints.each { |w| gpx_elem << w.to_xml } unless waypoints.nil?
|
236
254
|
routes.each { |r| gpx_elem << r.to_xml } unless routes.nil?
|
237
255
|
|
238
|
-
doc
|
256
|
+
return doc
|
239
257
|
end
|
240
258
|
|
241
|
-
private
|
242
|
-
|
243
259
|
# Calculates and sets the duration attribute by subtracting the time on
|
244
260
|
# the very first point from the time on the very last point.
|
245
261
|
def calculate_duration
|
data/lib/gpx/waypoint.rb
CHANGED
@@ -23,74 +23,74 @@
|
|
23
23
|
|
24
24
|
module GPX
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
# This class supports the concept of a waypoint. Beware that this class has
|
27
|
+
# not seen much use yet, since WalkingBoss does not use waypoints right now.
|
28
|
+
class Waypoint < Point
|
29
29
|
|
30
|
-
|
30
|
+
SUB_ELEMENTS = %w{ magvar geoidheight name cmt desc src link sym type fix sat hdop vdop pdop ageofdgpsdata dgpsid extensions }
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
attr_reader :gpx_file
|
33
|
+
SUB_ELEMENTS.each { |sub_el| attr_accessor sub_el.to_sym }
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
# Not implemented
|
36
|
+
def crop(area)
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
# Not implemented
|
40
|
+
def delete_area(area)
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
43
|
+
# Initializes a waypoint from a XML::Node.
|
44
|
+
def initialize(opts = {})
|
45
|
+
if(opts[:element] and opts[:gpx_file])
|
46
|
+
wpt_elem = opts[:element]
|
47
|
+
@gpx_file = opts[:gpx_file]
|
48
|
+
super(:element => wpt_elem, :gpx_file => @gpx_file)
|
49
|
+
instantiate_with_text_elements(wpt_elem, SUB_ELEMENTS, @gpx_file.ns)
|
50
|
+
else
|
51
|
+
opts.each do |key, value|
|
52
|
+
assignment_method = "#{key}="
|
53
|
+
if self.respond_to?(assignment_method)
|
54
|
+
self.send(assignment_method, value)
|
55
|
+
end
|
56
|
+
end
|
58
57
|
end
|
58
|
+
end
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
73
|
-
result
|
60
|
+
# Prints out a friendly summary of this track (sans points). Useful for
|
61
|
+
# debugging and sanity checks.
|
62
|
+
def to_s
|
63
|
+
result = "Waypoint \n"
|
64
|
+
result << "\tName: #{name}\n"
|
65
|
+
result << "\tLatitude: #{lat} \n"
|
66
|
+
result << "\tLongitude: #{lon} \n"
|
67
|
+
result << "\tElevation: #{elevation}\n "
|
68
|
+
result << "\tTime: #{time}\n"
|
69
|
+
SUB_ELEMENTS.each do |sub_element_attribute|
|
70
|
+
val = self.send(sub_element_attribute)
|
71
|
+
result << "\t#{sub_element_attribute}: #{val}\n" unless val.nil?
|
74
72
|
end
|
73
|
+
result
|
74
|
+
end
|
75
75
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
93
|
-
wpt
|
76
|
+
# Converts a waypoint to a XML::Node.
|
77
|
+
def to_xml(elem_name = 'wpt')
|
78
|
+
wpt = Node.new(elem_name)
|
79
|
+
wpt['lat'] = lat.to_s
|
80
|
+
wpt['lon'] = lon.to_s
|
81
|
+
SUB_ELEMENTS.each do |sub_element_name|
|
82
|
+
if(self.respond_to?(sub_element_name) and (!self.send(sub_element_name).nil?))
|
83
|
+
sub_elem_node = Node.new(sub_element_name)
|
84
|
+
sub_elem_node << self.send(sub_element_name)
|
85
|
+
wpt << sub_elem_node
|
86
|
+
end
|
87
|
+
end
|
88
|
+
unless(self.elevation.nil?)
|
89
|
+
ele_node = Node.new('ele')
|
90
|
+
ele_node << self.elevation
|
91
|
+
wpt << ele_node
|
94
92
|
end
|
95
|
-
|
93
|
+
wpt
|
94
|
+
end
|
95
|
+
end
|
96
96
|
end
|