gooby 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README +242 -0
- data/bin/example_usage.rb +38 -0
- data/bin/tests_gen.rb +16 -0
- data/data/20050305_corporate_cup_hm.csv +251 -0
- data/data/20050305_corporate_cup_hm.xml +2208 -0
- data/data/20050430_nashville_marathon.csv +1208 -0
- data/data/20050430_nashville_marathon.xml +10043 -0
- data/data/20051119_dowd_ymca_hm.csv +251 -0
- data/data/20051119_dowd_ymca_hm.xml +2210 -0
- data/data/20051124_hyatt_turkey_trot_8K.csv +321 -0
- data/data/20051124_hyatt_turkey_trot_8K.xml +2651 -0
- data/data/2007_03_03.tcx +6207 -0
- data/data/forerunner_2007.xml +259014 -0
- data/data/geo_data.txt +171 -0
- data/data/phx.csv +1280 -0
- data/data/phx.xml +10620 -0
- data/data/run_2007_01_01_16_38_27.xml +2020 -0
- data/data/run_2007_01_06_15_27_31.xml +2020 -0
- data/data/run_2007_01_10_12_25_47.xml +820 -0
- data/data/run_2007_01_10_22_44_54.csv +112 -0
- data/data/run_2007_01_10_22_44_54.xml +908 -0
- data/data/run_2007_01_11_10_48_45.xml +1292 -0
- data/data/run_2007_01_13_15_37_06.xml +1964 -0
- data/data/run_2007_01_14_15_46_02.xml +1368 -0
- data/data/run_2007_01_15_14_01_48.xml +1868 -0
- data/data/run_2007_01_20_16_22_05.xml +1702 -0
- data/data/run_2007_01_27_17_32_13.xml +3626 -0
- data/data/run_2007_01_28_19_14_52.xml +2538 -0
- data/data/run_2007_02_03_14_30_20.xml +2016 -0
- data/data/run_2007_02_04_18_02_30.xml +1476 -0
- data/data/run_2007_02_17_16_29_35.xml +1236 -0
- data/data/run_2007_02_19_14_44_33.xml +1816 -0
- data/data/run_2007_02_23_15_53_55.xml +36 -0
- data/data/run_2007_02_23_15_55_20.xml +1296 -0
- data/data/run_2007_02_24_15_01_35.csv +484 -0
- data/data/run_2007_02_24_15_01_35.xml +3884 -0
- data/data/test1.txt +4 -0
- data/img/gicons/blank.png +0 -0
- data/img/gicons/dd-end.png +0 -0
- data/img/gicons/dd-start.png +0 -0
- data/img/gicons/marker.png +0 -0
- data/img/gicons/marker0.png +0 -0
- data/img/gicons/marker00.png +0 -0
- data/img/gicons/marker01.png +0 -0
- data/img/gicons/marker02.png +0 -0
- data/img/gicons/marker03.png +0 -0
- data/img/gicons/marker04.png +0 -0
- data/img/gicons/marker05.png +0 -0
- data/img/gicons/marker06.png +0 -0
- data/img/gicons/marker07.png +0 -0
- data/img/gicons/marker08.png +0 -0
- data/img/gicons/marker09.png +0 -0
- data/img/gicons/marker1.png +0 -0
- data/img/gicons/marker10.png +0 -0
- data/img/gicons/marker11.png +0 -0
- data/img/gicons/marker12.png +0 -0
- data/img/gicons/marker13.png +0 -0
- data/img/gicons/marker14.png +0 -0
- data/img/gicons/marker15.png +0 -0
- data/img/gicons/marker16.png +0 -0
- data/img/gicons/marker17.png +0 -0
- data/img/gicons/marker18.png +0 -0
- data/img/gicons/marker19.png +0 -0
- data/img/gicons/marker2.png +0 -0
- data/img/gicons/marker20.png +0 -0
- data/img/gicons/marker21.png +0 -0
- data/img/gicons/marker22.png +0 -0
- data/img/gicons/marker23.png +0 -0
- data/img/gicons/marker24.png +0 -0
- data/img/gicons/marker25.png +0 -0
- data/img/gicons/marker26.png +0 -0
- data/img/gicons/marker27.png +0 -0
- data/img/gicons/marker28.png +0 -0
- data/img/gicons/marker29.png +0 -0
- data/img/gicons/marker3.png +0 -0
- data/img/gicons/marker30.png +0 -0
- data/img/gicons/marker31.png +0 -0
- data/img/gicons/marker32.png +0 -0
- data/img/gicons/marker33.png +0 -0
- data/img/gicons/marker34.png +0 -0
- data/img/gicons/marker35.png +0 -0
- data/img/gicons/marker36.png +0 -0
- data/img/gicons/marker37.png +0 -0
- data/img/gicons/marker38.png +0 -0
- data/img/gicons/marker39.png +0 -0
- data/img/gicons/marker4.png +0 -0
- data/img/gicons/marker40.png +0 -0
- data/img/gicons/marker41.png +0 -0
- data/img/gicons/marker42.png +0 -0
- data/img/gicons/marker43.png +0 -0
- data/img/gicons/marker44.png +0 -0
- data/img/gicons/marker45.png +0 -0
- data/img/gicons/marker46.png +0 -0
- data/img/gicons/marker47.png +0 -0
- data/img/gicons/marker48.png +0 -0
- data/img/gicons/marker49.png +0 -0
- data/img/gicons/marker5.png +0 -0
- data/img/gicons/marker50.png +0 -0
- data/img/gicons/marker51.png +0 -0
- data/img/gicons/marker52.png +0 -0
- data/img/gicons/marker53.png +0 -0
- data/img/gicons/marker54.png +0 -0
- data/img/gicons/marker55.png +0 -0
- data/img/gicons/marker56.png +0 -0
- data/img/gicons/marker57.png +0 -0
- data/img/gicons/marker58.png +0 -0
- data/img/gicons/marker59.png +0 -0
- data/img/gicons/marker6.png +0 -0
- data/img/gicons/marker60.png +0 -0
- data/img/gicons/marker61.png +0 -0
- data/img/gicons/marker62.png +0 -0
- data/img/gicons/marker63.png +0 -0
- data/img/gicons/marker64.png +0 -0
- data/img/gicons/marker65.png +0 -0
- data/img/gicons/marker66.png +0 -0
- data/img/gicons/marker67.png +0 -0
- data/img/gicons/marker68.png +0 -0
- data/img/gicons/marker69.png +0 -0
- data/img/gicons/marker7.png +0 -0
- data/img/gicons/marker70.png +0 -0
- data/img/gicons/marker71.png +0 -0
- data/img/gicons/marker72.png +0 -0
- data/img/gicons/marker73.png +0 -0
- data/img/gicons/marker74.png +0 -0
- data/img/gicons/marker75.png +0 -0
- data/img/gicons/marker76.png +0 -0
- data/img/gicons/marker77.png +0 -0
- data/img/gicons/marker78.png +0 -0
- data/img/gicons/marker79.png +0 -0
- data/img/gicons/marker8.png +0 -0
- data/img/gicons/marker80.png +0 -0
- data/img/gicons/marker81.png +0 -0
- data/img/gicons/marker82.png +0 -0
- data/img/gicons/marker83.png +0 -0
- data/img/gicons/marker84.png +0 -0
- data/img/gicons/marker85.png +0 -0
- data/img/gicons/marker86.png +0 -0
- data/img/gicons/marker87.png +0 -0
- data/img/gicons/marker88.png +0 -0
- data/img/gicons/marker89.png +0 -0
- data/img/gicons/marker9.png +0 -0
- data/img/gicons/marker90.png +0 -0
- data/img/gicons/marker91.png +0 -0
- data/img/gicons/marker92.png +0 -0
- data/img/gicons/marker93.png +0 -0
- data/img/gicons/marker94.png +0 -0
- data/img/gicons/marker95.png +0 -0
- data/img/gicons/marker96.png +0 -0
- data/img/gicons/marker97.png +0 -0
- data/img/gicons/marker98.png +0 -0
- data/img/gicons/marker99.png +0 -0
- data/img/gicons/markerA.png +0 -0
- data/img/gicons/markerB.png +0 -0
- data/img/gicons/markerC.png +0 -0
- data/img/gicons/markerD.png +0 -0
- data/img/gicons/markerE.png +0 -0
- data/img/gicons/markerF.png +0 -0
- data/img/gicons/markerG.png +0 -0
- data/img/gicons/markerH.png +0 -0
- data/img/gicons/markerI.png +0 -0
- data/img/gicons/markerJ.png +0 -0
- data/img/gicons/mm_20_red.png +0 -0
- data/img/gicons/mm_20_shadow.png +0 -0
- data/img/gicons/readme.txt +11 -0
- data/img/gicons/shadow50.png +0 -0
- data/lib/gooby/cls_counter_hash.rb +78 -0
- data/lib/gooby/cls_delim_line.rb +35 -0
- data/lib/gooby/cls_dttm.rb +79 -0
- data/lib/gooby/cls_duration.rb +79 -0
- data/lib/gooby/cls_forerunner_xml_parser.rb +178 -0
- data/lib/gooby/cls_forerunner_xml_splitter.rb +109 -0
- data/lib/gooby/cls_geo_data.rb +181 -0
- data/lib/gooby/cls_gooby_command.rb +35 -0
- data/lib/gooby/cls_gooby_object.rb +18 -0
- data/lib/gooby/cls_google_map_generator.rb +363 -0
- data/lib/gooby/cls_history.rb +33 -0
- data/lib/gooby/cls_lap.rb +22 -0
- data/lib/gooby/cls_line.rb +75 -0
- data/lib/gooby/cls_options.rb +67 -0
- data/lib/gooby/cls_position.rb +44 -0
- data/lib/gooby/cls_run.rb +194 -0
- data/lib/gooby/cls_simple_xml_parser.rb +41 -0
- data/lib/gooby/cls_test_regen.rb +182 -0
- data/lib/gooby/cls_track.rb +47 -0
- data/lib/gooby/cls_trackpoint.rb +200 -0
- data/lib/gooby/mod_introspect.rb +26 -0
- data/lib/gooby/mod_io.rb +58 -0
- data/lib/gooby/mod_project_info.rb +80 -0
- data/lib/gooby/mod_string.rb +19 -0
- data/lib/gooby/mod_test_helper.rb +15 -0
- data/lib/gooby.rb +2265 -0
- data/pkg/code_header.txt +21 -0
- data/pkg/pkg.rb +236 -0
- data/pkg/test_header.txt +19 -0
- data/samples/20041113_richmond_marathon.html +532 -0
- data/samples/20050305_corporate_cup_hm.html +448 -0
- data/samples/20050430_nashville_marathon.html +530 -0
- data/samples/gps_point_capture.html +54 -0
- data/samples/phoenix_marathon.html +542 -0
- data/samples/run_2007_01_10_22_44_54.html +201 -0
- data/samples/run_2007_02_24_15_01_35.html +298 -0
- data/tests/tc_cls_counter_hash.rb +107 -0
- data/tests/tc_cls_delim_line.rb +74 -0
- data/tests/tc_cls_dttm.rb +131 -0
- data/tests/tc_cls_duration.rb +51 -0
- data/tests/tc_cls_forerunner_xml_parser.rb +70 -0
- data/tests/tc_cls_geo_data.xxx +71 -0
- data/tests/tc_cls_gooby_object.rb +26 -0
- data/tests/tc_cls_google_map_generator.rb +109 -0
- data/tests/tc_cls_history.rb +46 -0
- data/tests/tc_cls_lap.rb +38 -0
- data/tests/tc_cls_line.rb +110 -0
- data/tests/tc_cls_options.rb +79 -0
- data/tests/tc_cls_position.rb +66 -0
- data/tests/tc_cls_run.rb +142 -0
- data/tests/tc_cls_simple_xml_parser.rb +50 -0
- data/tests/tc_cls_track.rb +70 -0
- data/tests/tc_cls_trackpoint.rb +145 -0
- data/tests/tc_mod_introspect.rb +32 -0
- data/tests/tc_mod_io.rb +53 -0
- data/tests/tc_mod_project_info.rb +79 -0
- data/tests/tc_mod_string.rb +58 -0
- data/tests/ts_gooby.rb +1237 -0
- metadata +270 -0
@@ -0,0 +1,363 @@
|
|
1
|
+
module Gooby
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
Instances of this class represent a <Run> aggregate object from a
|
5
|
+
Forerunner XML file.
|
6
|
+
|
7
|
+
Additionally, there is distance, pace, and Google Map generation logic
|
8
|
+
in this class.
|
9
|
+
=end
|
10
|
+
|
11
|
+
class GoogleMapGenerator < GoobyObject
|
12
|
+
|
13
|
+
attr_reader :csv_file, :csv_lines, :dttm_idx, :num_idx, :lat_idx, :lng_idx, :alt_idx, :cdist_idx
|
14
|
+
attr_reader :run, :tkpts, :content_hash, :center_longitude, :center_latitude, :gpoint_array, :overlay_points, :notes
|
15
|
+
attr_reader :center_longitude, :center_latitude
|
16
|
+
|
17
|
+
# The default csv input file format is as follows:
|
18
|
+
# 1 | 2006-01-15T18:31:10Z | 1279 | 33.42601 | -111.92927 | 347.654 | 26.3514930151813
|
19
|
+
# 1 | 2004-11-13T13:05:20Z | 2 | 37.54318 | -77.43636 | -58.022 | 0.00297286231747969
|
20
|
+
|
21
|
+
def initialize(csv_file, dttm_idx=1, num_idx=2, lat_idx=3, lng_idx=4, alt_idx=5, cdist_idx=6)
|
22
|
+
@csv_file = csv_file
|
23
|
+
@dttm_idx = dttm_idx
|
24
|
+
@num_idx = num_idx
|
25
|
+
@lat_idx = lat_idx
|
26
|
+
@lng_idx = lng_idx
|
27
|
+
@alt_idx = alt_idx
|
28
|
+
@cdist_idx = cdist_idx
|
29
|
+
@options = Gooby::Options.new(nil)
|
30
|
+
@content_hash = Hash.new('')
|
31
|
+
@run = Gooby::Run.new(1)
|
32
|
+
@track = Gooby::Track.new(1)
|
33
|
+
@run.add_track(@track)
|
34
|
+
@tkpts = Array.new
|
35
|
+
|
36
|
+
@csv_lines = read_as_ascii_lines(@csv_file, 10, true)
|
37
|
+
@csv_lines.each { | line |
|
38
|
+
dline = Gooby::DelimLine.new(line)
|
39
|
+
if (!dline.is_comment?)
|
40
|
+
tkpt = dline.as_trackpoint(@num_idx, @lat_idx, @lng_idx, @alt_idx, @dttm_idx)
|
41
|
+
if tkpt
|
42
|
+
@track.add_trackpoint(tkpt)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
}
|
46
|
+
@run.finish
|
47
|
+
end
|
48
|
+
|
49
|
+
=begin
|
50
|
+
Returns a Hash with specific generated content at the following keys:
|
51
|
+
=end
|
52
|
+
def generate(options)
|
53
|
+
if (options == nil)
|
54
|
+
@options = Gooby::Options.new(nil)
|
55
|
+
else
|
56
|
+
@options = options
|
57
|
+
end
|
58
|
+
@content_hash['when_generated'] = Time.now
|
59
|
+
@content_hash['title'] = @options.get('gmap_title')
|
60
|
+
filter_trackpoints
|
61
|
+
compute_center_point
|
62
|
+
generate_key_js
|
63
|
+
generate_map_div
|
64
|
+
generate_messages_div
|
65
|
+
generate_main_js_start
|
66
|
+
generate_main_js_route_overlay
|
67
|
+
generate_main_js_checkpoint_overlays
|
68
|
+
generate_main_js_map_clicked_listeners
|
69
|
+
generate_main_js_end
|
70
|
+
@content_hash
|
71
|
+
end
|
72
|
+
|
73
|
+
def filter_trackpoints
|
74
|
+
count, @tkpts = 0, Array.new
|
75
|
+
firstTkpt = @options.get('gmap_first_tkpt_number')
|
76
|
+
lastTkpt = @options.get('gmap_last_tkpt_number')
|
77
|
+
@run.tracks.each { |trk|
|
78
|
+
trk.trackpoints.each { |tkpt|
|
79
|
+
count = count + 1
|
80
|
+
if ((count >= firstTkpt) && (count <= lastTkpt))
|
81
|
+
@tkpts.push(tkpt)
|
82
|
+
end
|
83
|
+
}
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
=begin
|
88
|
+
Returns a Hash with specific generated content at the following keys:
|
89
|
+
=end
|
90
|
+
def generate_page(options)
|
91
|
+
|
92
|
+
# puts "generate_page #{@csv_file} #{@csv_lines.size}"
|
93
|
+
content_hash = generate(nil)
|
94
|
+
s = String.new(@csv_file)
|
95
|
+
s.gsub("/", " ")
|
96
|
+
tokens = tokenize(s, nil)
|
97
|
+
out_file = "#{tokens[-2]}.html"
|
98
|
+
#content_hash.keys.sort.each { | key | puts key }
|
99
|
+
|
100
|
+
s = <<HERE
|
101
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
102
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
103
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
104
|
+
<head>
|
105
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
|
106
|
+
<title> Google Map by Gooby </title>
|
107
|
+
#{content_hash['key_js']}
|
108
|
+
#{content_hash['main_js_start']}
|
109
|
+
#{content_hash['main_js_route_overlay']}
|
110
|
+
#{content_hash['main_js_checkpoint_overlays']}
|
111
|
+
#{content_hash['main_js_map_clicked_listeners']}
|
112
|
+
#{content_hash['main_js_end']}
|
113
|
+
</head>
|
114
|
+
<body onload="load()" onunload="GUnload()">
|
115
|
+
<center>
|
116
|
+
<h3> #{content_hash['title']} </h3>
|
117
|
+
<h5> Generated by Gooby #{content_hash['when_generated']} <br> Gooby = Google APIs + Ruby </h5>
|
118
|
+
#{content_hash['map_div']}
|
119
|
+
#{content_hash['messages_div']}
|
120
|
+
</center>
|
121
|
+
</body>
|
122
|
+
</html>
|
123
|
+
HERE
|
124
|
+
|
125
|
+
# html_file = File.new(out_file, "w+")
|
126
|
+
# html_file.write(s)
|
127
|
+
# html_file.flush
|
128
|
+
# html_file.close
|
129
|
+
puts s # Output is redirected by shell.
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def compute_center_point
|
135
|
+
highLat = -999.0
|
136
|
+
highLong = -999.0
|
137
|
+
lowLat = 999.0
|
138
|
+
lowLong = 999.0
|
139
|
+
@tkpts.each { |tkpt|
|
140
|
+
highLat = tkpt.latitude_as_float if tkpt.latitude_as_float > highLat
|
141
|
+
lowLat = tkpt.latitude_as_float if tkpt.latitude_as_float < lowLat
|
142
|
+
highLong = tkpt.longitude_as_float if tkpt.longitude_as_float > highLong
|
143
|
+
lowLong = tkpt.longitude_as_float if tkpt.longitude_as_float < lowLong
|
144
|
+
}
|
145
|
+
@center_longitude = (highLong + lowLong) / 2
|
146
|
+
@center_latitude = (highLat + lowLat) / 2
|
147
|
+
@content_hash['center_longitude'] = @center_longitude
|
148
|
+
@content_hash['center_latitude'] = @center_latitude
|
149
|
+
end
|
150
|
+
|
151
|
+
def generate_key_js
|
152
|
+
key = @options.get('gmap_key')
|
153
|
+
key.strip!
|
154
|
+
s = '<script src="http://maps.google.com/maps?file=api&v=2&key='
|
155
|
+
s << key
|
156
|
+
s << '" type="text/javascript"></script>'
|
157
|
+
@content_hash['key_js'] = s
|
158
|
+
end
|
159
|
+
|
160
|
+
def generate_map_div
|
161
|
+
width = @options.get('gmap_width')
|
162
|
+
height = @options.get('gmap_height')
|
163
|
+
id = @options.get('gmap_map_element_id')
|
164
|
+
s = '<div id="'
|
165
|
+
s << id
|
166
|
+
s << '" style="width: '
|
167
|
+
s << width
|
168
|
+
s << '; height: '
|
169
|
+
s << height
|
170
|
+
s << '"></div>'
|
171
|
+
@content_hash['map_width'] = width
|
172
|
+
@content_hash['map_height'] = height
|
173
|
+
@content_hash['map_div'] = s
|
174
|
+
end
|
175
|
+
|
176
|
+
def generate_messages_div
|
177
|
+
s = "<div id=\"messages\"></div>"
|
178
|
+
@content_hash['messages_div'] = s
|
179
|
+
end
|
180
|
+
|
181
|
+
def generate_main_js_start
|
182
|
+
id = @options.get('gmap_map_element_id')
|
183
|
+
size = @options.get('gmap_size_control')
|
184
|
+
type = @options.get('gmap_type')
|
185
|
+
zoom = @options.get('gmap_zoom_level')
|
186
|
+
title = @options.get('gmap_title')
|
187
|
+
if size
|
188
|
+
if size == 'smallmap'
|
189
|
+
size = 'GSmallMapControl'
|
190
|
+
elsif size == 'smallzoom'
|
191
|
+
size = 'GSmallMapControl'
|
192
|
+
else
|
193
|
+
size = 'GLargeMapControl'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
if type
|
198
|
+
if type == 'satellite'
|
199
|
+
type = 'G_SATELLITE_MAP'
|
200
|
+
elsif type == 'hybrid'
|
201
|
+
type = 'G_HYBRID_MAP'
|
202
|
+
else
|
203
|
+
type = 'G_NORMAL_MAP'
|
204
|
+
end
|
205
|
+
else
|
206
|
+
type = 'G_NORMAL_MAP'
|
207
|
+
end
|
208
|
+
|
209
|
+
s = '<script type="text/javascript">'
|
210
|
+
s << "\n"
|
211
|
+
s << "//<![CDATA[ \n"
|
212
|
+
s << " function load() { \n"
|
213
|
+
s << " if (GBrowserIsCompatible()) { \n"
|
214
|
+
s << ' var map = new GMap2(document.getElementById("'
|
215
|
+
s << id
|
216
|
+
s << '")); '
|
217
|
+
s << "\n"
|
218
|
+
|
219
|
+
if size
|
220
|
+
s << ' map.addControl(new '
|
221
|
+
s << size
|
222
|
+
s << '());'
|
223
|
+
s << "\n"
|
224
|
+
end
|
225
|
+
|
226
|
+
if type
|
227
|
+
s << ' map.addControl(new GMapTypeControl());'
|
228
|
+
s << "\n"
|
229
|
+
# s << ' map.setMapType('
|
230
|
+
# s << type
|
231
|
+
# s << ');'
|
232
|
+
s << "\n"
|
233
|
+
end
|
234
|
+
s << " var centerPoint = new GLatLng(#{@center_latitude}, #{@center_longitude}); \n"
|
235
|
+
s << " map.setCenter(centerPoint, #{zoom}); \n"
|
236
|
+
s << "\n"
|
237
|
+
@content_hash['main_js_start'] = s
|
238
|
+
@content_hash['title'] = title
|
239
|
+
end
|
240
|
+
|
241
|
+
def generate_main_js_route_overlay
|
242
|
+
tkpt_count = @tkpts.size.to_f
|
243
|
+
app_max = @options.get('gmap_approx_max_points').to_f
|
244
|
+
comments = @options.get('gmap_gen_comments')
|
245
|
+
ratio = tkpt_count / app_max
|
246
|
+
@start_dttm = nil
|
247
|
+
if ratio > 1.0
|
248
|
+
increment = (tkpt_count / app_max).to_i
|
249
|
+
else
|
250
|
+
increment = 1
|
251
|
+
end
|
252
|
+
curr_idx, next_idx, gpoint_count, last_idx = -1, 0, 0, @tkpts.size - 1
|
253
|
+
s = " var points = new Array(); "
|
254
|
+
@tkpts.each { |tkpt|
|
255
|
+
curr_idx = curr_idx + 1
|
256
|
+
if curr_idx == 0
|
257
|
+
@start_dttm = tkpt.dttm
|
258
|
+
@start_pos = tkpt.position
|
259
|
+
time = Time.parse(@start_dttm.dateTime().to_s)
|
260
|
+
end
|
261
|
+
if ((curr_idx == next_idx) || (curr_idx == last_idx) || (tkpt.is_split()))
|
262
|
+
gpoint_count = gpoint_count + 1
|
263
|
+
s << tkpt.as_glatlng(comments, tkpt_count, curr_idx, gpoint_count, @start_dttm)
|
264
|
+
next_idx = curr_idx + increment
|
265
|
+
end
|
266
|
+
}
|
267
|
+
s << "\n"
|
268
|
+
s << "\n var routePolyline = new GPolyline(points); "
|
269
|
+
s << "\n map.addOverlay(routePolyline); "
|
270
|
+
@content_hash['main_js_route_overlay'] = s
|
271
|
+
@content_hash['main_js_route_overlay_increment'] = increment
|
272
|
+
end
|
273
|
+
|
274
|
+
def generate_main_js_checkpoint_overlays
|
275
|
+
s = "\n // Create a base icon for all of our markers that specifies the "
|
276
|
+
s << "\n // shadow, icon dimensions, etc."
|
277
|
+
s << "\n var baseIcon = new GIcon();"
|
278
|
+
s << "\n baseIcon.shadow = \"http://www.joakim-systems.com/gicons/shadow50.png\";"
|
279
|
+
s << "\n baseIcon.iconSize = new GSize(20, 34);"
|
280
|
+
s << "\n baseIcon.shadowSize = new GSize(37, 34);"
|
281
|
+
s << "\n baseIcon.iconAnchor = new GPoint(9, 34);"
|
282
|
+
s << "\n baseIcon.infoWindowAnchor = new GPoint(9, 2);"
|
283
|
+
s << "\n baseIcon.infoShadowAnchor = new GPoint(18, 25);"
|
284
|
+
s << "\n"
|
285
|
+
|
286
|
+
curr_idx = -1
|
287
|
+
last_idx = @tkpts.size - 1
|
288
|
+
next_checkpoint = 0.0
|
289
|
+
@start_dttm = nil
|
290
|
+
@tkpts.each { | tkpt |
|
291
|
+
curr_idx = curr_idx + 1
|
292
|
+
if curr_idx == 0
|
293
|
+
@start_dttm = tkpt.dttm
|
294
|
+
info_window_html = tkpt.as_info_window_html('Start', @start_dttm)
|
295
|
+
s << "\n var iconStart = new GIcon(baseIcon); "
|
296
|
+
s << "\n iconStart.image = \"http://www.joakim-systems.com/gicons/dd-start.png\";"
|
297
|
+
s << "\n var pStart = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
|
298
|
+
s << "\n var mStart = new GMarker(pStart, iconStart);"
|
299
|
+
s << "\n GEvent.addListener(mStart, \"click\", function() { "
|
300
|
+
s << "\n mStart.openInfoWindowHtml(#{info_window_html});"
|
301
|
+
s << "\n }); "
|
302
|
+
s << "\n map.addOverlay(mStart);"
|
303
|
+
s << "\n "
|
304
|
+
next_checkpoint = 1.0
|
305
|
+
elsif curr_idx == last_idx
|
306
|
+
info_window_html = tkpt.as_info_window_html('Finish', @start_dttm)
|
307
|
+
s << "\n var iconFinish = new GIcon(baseIcon); "
|
308
|
+
s << "\n iconFinish.image = \"http://www.joakim-systems.com/gicons/dd-end.png\";"
|
309
|
+
s << "\n var pFinish = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
|
310
|
+
s << "\n var mFinish = new GMarker(pFinish, iconFinish);"
|
311
|
+
s << "\n GEvent.addListener(mFinish, \"click\", function() { "
|
312
|
+
s << "\n mFinish.openInfoWindowHtml(#{info_window_html});"
|
313
|
+
s << "\n }); "
|
314
|
+
s << "\n map.addOverlay(mFinish);"
|
315
|
+
s << "\n "
|
316
|
+
next_checkpoint = 999999
|
317
|
+
else
|
318
|
+
if (tkpt.cumulativeDistance >= next_checkpoint)
|
319
|
+
integer = next_checkpoint.to_i
|
320
|
+
info_window_html = tkpt.as_info_window_html("#{integer}", @start_dttm)
|
321
|
+
s << "\n var icon#{integer} = new GIcon(baseIcon); "
|
322
|
+
s << "\n icon#{integer}.image = \"http://www.joakim-systems.com/gicons/marker#{integer}.png\";"
|
323
|
+
s << "\n var p#{integer} = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
|
324
|
+
s << "\n var m#{integer} = new GMarker(p#{integer}, icon#{integer});"
|
325
|
+
s << "\n GEvent.addListener(m#{integer}, \"click\", function() { "
|
326
|
+
s << "\n m#{integer}.openInfoWindowHtml(#{info_window_html});"
|
327
|
+
s << "\n }); "
|
328
|
+
s << "\n map.addOverlay(m#{integer});"
|
329
|
+
s << "\n "
|
330
|
+
next_checkpoint = next_checkpoint + 1.0
|
331
|
+
end
|
332
|
+
end
|
333
|
+
}
|
334
|
+
s << "\n"
|
335
|
+
@content_hash['main_js_checkpoint_overlays'] = s
|
336
|
+
|
337
|
+
end
|
338
|
+
|
339
|
+
def generate_main_js_map_clicked_listeners
|
340
|
+
s = "\n"
|
341
|
+
s << "\n GEvent.addListener(map, \"click\", function() { "
|
342
|
+
s << "\n var center = map.getCenter(); \n"
|
343
|
+
s << "\n document.getElementById(\"messages\").innerHTML = 'click: ' + center.toString(); "
|
344
|
+
s << "\n });"
|
345
|
+
s << "\n GEvent.addListener(map, \"moveend\", function() { "
|
346
|
+
s << "\n var center = map.getCenter(); \n"
|
347
|
+
s << "\n document.getElementById(\"messages\").innerHTML = 'moveend: ' + center.toString(); "
|
348
|
+
s << "\n });"
|
349
|
+
@content_hash['main_js_map_clicked_listeners'] = s
|
350
|
+
end
|
351
|
+
|
352
|
+
def generate_main_js_end
|
353
|
+
s = "\n } "
|
354
|
+
s << "\n } "
|
355
|
+
s << "\n//]]> \n"
|
356
|
+
s << "\n</script>"
|
357
|
+
|
358
|
+
@content_hash['main_js_end'] = s
|
359
|
+
end
|
360
|
+
|
361
|
+
end
|
362
|
+
|
363
|
+
end # end of module
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Gooby
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
Instances of this class represent a <History> aggregate object from a
|
5
|
+
Forerunner XML file.
|
6
|
+
=end
|
7
|
+
|
8
|
+
class History < GoobyObject
|
9
|
+
|
10
|
+
attr_reader :runs
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@runs = Array.new
|
14
|
+
end
|
15
|
+
|
16
|
+
# Adds a Run during XML parsing.
|
17
|
+
def add_run(run)
|
18
|
+
@runs.push(run)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
return "Hist: runs: #{@runs.size}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def print_string
|
26
|
+
s = "History: run count=#{@runs.size} \n"
|
27
|
+
runs.each { | run | s << run.print_string }
|
28
|
+
s
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end # end of module
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Gooby
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
Instances of this class represent a <Lap> aggregate object from a
|
5
|
+
Forerunner XML file.
|
6
|
+
=end
|
7
|
+
|
8
|
+
class Lap < GoobyObject
|
9
|
+
|
10
|
+
attr_accessor :number, :startTime, :duration, :length, :beginPosition, :endPosition
|
11
|
+
|
12
|
+
def initialize(num)
|
13
|
+
@number = num
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
return "Lap: num: #{@number} start: #{@startTime} dur: #{@duration} len: #{@length} begin: #{@beginPosition.to_s} end: #{@endPosition.to_s}"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end # end of module
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Gooby
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
|
5
|
+
=end
|
6
|
+
|
7
|
+
class Line < GoobyObject
|
8
|
+
|
9
|
+
attr_accessor :raw_data, :tokens
|
10
|
+
|
11
|
+
def initialize(raw='', delim=nil, strip=false)
|
12
|
+
if strip
|
13
|
+
@raw_data = raw.strip
|
14
|
+
else
|
15
|
+
@raw_data = raw
|
16
|
+
end
|
17
|
+
|
18
|
+
@tokens = tokenize(@raw_data, delim, strip=false)
|
19
|
+
end
|
20
|
+
|
21
|
+
public
|
22
|
+
|
23
|
+
def token(idx)
|
24
|
+
@tokens[idx]
|
25
|
+
end
|
26
|
+
|
27
|
+
def token_count
|
28
|
+
@tokens.size
|
29
|
+
end
|
30
|
+
|
31
|
+
def token_idx_equals(idx, value)
|
32
|
+
if idx < token_count
|
33
|
+
if @tokens[idx] == value
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
def match(pattern)
|
41
|
+
@raw_data.match(pattern)
|
42
|
+
end
|
43
|
+
|
44
|
+
def is_comment
|
45
|
+
s = @raw_data.strip
|
46
|
+
(s.match('^#')) ? true : false
|
47
|
+
end
|
48
|
+
|
49
|
+
def is_populated_non_comment
|
50
|
+
s = @raw_data.strip
|
51
|
+
if s.size == 0
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
if is_comment
|
55
|
+
return false
|
56
|
+
end
|
57
|
+
return true
|
58
|
+
end
|
59
|
+
|
60
|
+
def concatinate_tokens(start_idx = 0)
|
61
|
+
s = ''
|
62
|
+
idx = -1
|
63
|
+
@tokens.each { |tok|
|
64
|
+
idx = idx + 1
|
65
|
+
if idx >= start_idx
|
66
|
+
s << tok
|
67
|
+
s << ' '
|
68
|
+
end
|
69
|
+
}
|
70
|
+
s.strip!
|
71
|
+
s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end # end of module
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Gooby
|
2
|
+
|
3
|
+
class Options < GoobyObject
|
4
|
+
|
5
|
+
attr_reader :yamlFilename, :options
|
6
|
+
|
7
|
+
def initialize(filename) # Constructor.
|
8
|
+
filename ? @yamlFilename = filename : @yamlFilename = 'gooby_options.yaml'
|
9
|
+
loadFile()
|
10
|
+
end
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
# Load the @yamlFilename
|
15
|
+
def loadFile
|
16
|
+
File.open("#{@yamlFilename}") { |fn|
|
17
|
+
@options = YAML::load(fn)
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(name)
|
22
|
+
if name == nil
|
23
|
+
return ''
|
24
|
+
end
|
25
|
+
s = @options["#{name}"]
|
26
|
+
|
27
|
+
# Provide "sensible defaults".
|
28
|
+
if s == nil
|
29
|
+
if (name == '')
|
30
|
+
return ''
|
31
|
+
elsif (name == 'gmap_first_tkpt_number')
|
32
|
+
return 1
|
33
|
+
elsif (name == 'gmap_last_tkpt_number')
|
34
|
+
return 5000
|
35
|
+
elsif (name == 'gmap_map_element_id')
|
36
|
+
return 'map'
|
37
|
+
elsif (name == 'gmap_height')
|
38
|
+
return '600'
|
39
|
+
elsif (name == 'gmap_key')
|
40
|
+
return 'enter your Google Map Key here'
|
41
|
+
elsif (name == 'gmap_type_control')
|
42
|
+
return true
|
43
|
+
elsif (name == 'gmap_approx_max_points')
|
44
|
+
return '200'
|
45
|
+
elsif (name == 'gmap_gen_comments')
|
46
|
+
return true
|
47
|
+
elsif (name == 'gmap_size_control')
|
48
|
+
return nil
|
49
|
+
elsif (name == 'gmap_type')
|
50
|
+
return 'G_NORMAL_MAP'
|
51
|
+
elsif (name == 'gmap_zoom_level')
|
52
|
+
return 5
|
53
|
+
else
|
54
|
+
return ''
|
55
|
+
end
|
56
|
+
end
|
57
|
+
s
|
58
|
+
end
|
59
|
+
|
60
|
+
# Return a String containing yaml filename and entry count.
|
61
|
+
def to_s
|
62
|
+
return "Options: filename: #{@yamlFilename} entries: #{@options.size}"
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end # end of module
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Gooby
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
Instances of this class represent a <Position> aggregate object from a
|
5
|
+
Forerunner XML file. Each contains a latitude and longitude.
|
6
|
+
Instances within a Trackpoint will also contain an altitude.
|
7
|
+
=end
|
8
|
+
|
9
|
+
class Position < GoobyObject
|
10
|
+
|
11
|
+
attr_accessor :latitude, :longitude, :altitude, :note
|
12
|
+
|
13
|
+
def initialize(lat, lng, alt='0', note='')
|
14
|
+
@latitude = lat.to_s
|
15
|
+
@longitude = lng.to_s
|
16
|
+
@altitude = alt.to_s
|
17
|
+
@note = note.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
public
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
return "lat: #{@latitude} lng: #{@longitude} alt: #{@altitude} note: #{@note}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_csv
|
27
|
+
return "#{@latitude} | #{@longitude} | #{@altitude}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def latitude_as_float
|
31
|
+
@latitude ? @latitude.to_f : invalid_latitude
|
32
|
+
end
|
33
|
+
|
34
|
+
def longitude_as_float
|
35
|
+
@longitude ? @longitude.to_f : invalid_longitude
|
36
|
+
end
|
37
|
+
|
38
|
+
def altitude_as_float
|
39
|
+
@altitude ? @altitude.to_f : invalid_altitude
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end # end of module
|