Gooby 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/README +218 -0
  2. data/bin/forerunner_xml_parser.rb +28 -0
  3. data/bin/forerunner_xml_parser.sh +16 -0
  4. data/bin/forerunner_xml_splitter.rb +60 -0
  5. data/bin/gen_gmap.rb +30 -0
  6. data/bin/gen_gmap.sh +19 -0
  7. data/bin/tests_gen.rb +13 -0
  8. data/data/20041113_richmond_marathon.csv +1036 -0
  9. data/data/20041113_richmond_marathon.xml +8663 -0
  10. data/data/20050305_corporate_cup_hm.csv +251 -0
  11. data/data/20050305_corporate_cup_hm.xml +2208 -0
  12. data/data/20050430_nashville_marathon.csv +1208 -0
  13. data/data/20050430_nashville_marathon.xml +10043 -0
  14. data/data/20051119_dowd_ymca_hm.csv +251 -0
  15. data/data/20051119_dowd_ymca_hm.xml +2210 -0
  16. data/data/20051124_hyatt_turkey_trot_8K.csv +321 -0
  17. data/data/20051124_hyatt_turkey_trot_8K.xml +2651 -0
  18. data/data/forerunner_2005.xml +259620 -0
  19. data/data/forerunner_2006.xml +190853 -0
  20. data/data/forerunner_2007.xml +259014 -0
  21. data/data/geo_data.txt +171 -0
  22. data/data/phx.csv +1280 -0
  23. data/data/phx.xml +10620 -0
  24. data/data/run_2007_01_01_16_38_27.xml +2020 -0
  25. data/data/run_2007_01_06_15_27_31.xml +2020 -0
  26. data/data/run_2007_01_10_12_25_47.xml +820 -0
  27. data/data/run_2007_01_10_22_44_54.csv +112 -0
  28. data/data/run_2007_01_10_22_44_54.xml +908 -0
  29. data/data/run_2007_01_11_10_48_45.xml +1292 -0
  30. data/data/run_2007_01_13_15_37_06.xml +1964 -0
  31. data/data/run_2007_01_14_15_46_02.xml +1368 -0
  32. data/data/run_2007_01_15_14_01_48.xml +1868 -0
  33. data/data/run_2007_01_20_16_22_05.xml +1702 -0
  34. data/data/run_2007_01_27_17_32_13.xml +3626 -0
  35. data/data/run_2007_01_28_19_14_52.xml +2538 -0
  36. data/data/run_2007_02_03_14_30_20.xml +2016 -0
  37. data/data/run_2007_02_04_18_02_30.xml +1476 -0
  38. data/data/run_2007_02_17_16_29_35.xml +1236 -0
  39. data/data/run_2007_02_19_14_44_33.xml +1816 -0
  40. data/data/run_2007_02_23_15_53_55.xml +36 -0
  41. data/data/run_2007_02_23_15_55_20.xml +1296 -0
  42. data/data/run_2007_02_24_15_01_35.csv +484 -0
  43. data/data/run_2007_02_24_15_01_35.xml +3884 -0
  44. data/data/test1.txt +4 -0
  45. data/lib/cls_counter_hash.rb +83 -0
  46. data/lib/cls_delim_line.rb +40 -0
  47. data/lib/cls_dttm.rb +84 -0
  48. data/lib/cls_duration.rb +87 -0
  49. data/lib/cls_forerunner_xml_parser.rb +183 -0
  50. data/lib/cls_forerunner_xml_splitter.rb +113 -0
  51. data/lib/cls_geo_data.rb +186 -0
  52. data/lib/cls_gooby_object.rb +23 -0
  53. data/lib/cls_google_map_generator.rb +368 -0
  54. data/lib/cls_history.rb +38 -0
  55. data/lib/cls_lap.rb +27 -0
  56. data/lib/cls_line.rb +78 -0
  57. data/lib/cls_options.rb +74 -0
  58. data/lib/cls_position.rb +49 -0
  59. data/lib/cls_run.rb +199 -0
  60. data/lib/cls_simple_xml_parser.rb +46 -0
  61. data/lib/cls_test_regen.rb +187 -0
  62. data/lib/cls_track.rb +52 -0
  63. data/lib/cls_trackpoint.rb +205 -0
  64. data/lib/mod_introspect.rb +33 -0
  65. data/lib/mod_io.rb +65 -0
  66. data/lib/mod_project_info.rb +81 -0
  67. data/lib/mod_string.rb +26 -0
  68. data/lib/mod_test_helper.rb +22 -0
  69. data/samples/20041113_richmond_marathon.html +532 -0
  70. data/samples/20050305_corporate_cup_hm.html +448 -0
  71. data/samples/20050430_nashville_marathon.html +530 -0
  72. data/samples/gps_point_capture.html +54 -0
  73. data/samples/phoenix_marathon.html +542 -0
  74. data/samples/run_2007_01_10_22_44_54.html +146 -0
  75. data/samples/run_2007_02_24_15_01_35.html +298 -0
  76. data/tests/tst_cls_counter_hash.rb +105 -0
  77. data/tests/tst_cls_delim_line.rb +72 -0
  78. data/tests/tst_cls_dttm.rb +129 -0
  79. data/tests/tst_cls_duration.rb +49 -0
  80. data/tests/tst_cls_forerunner_xml_parser.rb +68 -0
  81. data/tests/tst_cls_geo_data.rb +69 -0
  82. data/tests/tst_cls_gooby_object.rb +24 -0
  83. data/tests/tst_cls_google_map_generator.rb +107 -0
  84. data/tests/tst_cls_history.rb +44 -0
  85. data/tests/tst_cls_lap.rb +36 -0
  86. data/tests/tst_cls_line.rb +108 -0
  87. data/tests/tst_cls_options.rb +77 -0
  88. data/tests/tst_cls_position.rb +64 -0
  89. data/tests/tst_cls_run.rb +140 -0
  90. data/tests/tst_cls_simple_xml_parser.rb +48 -0
  91. data/tests/tst_cls_track.rb +68 -0
  92. data/tests/tst_cls_trackpoint.rb +143 -0
  93. data/tests/tst_gooby.rb +28 -0
  94. data/tests/tst_mod_introspect.rb +30 -0
  95. data/tests/tst_mod_io.rb +51 -0
  96. data/tests/tst_mod_project_info.rb +77 -0
  97. data/tests/tst_mod_string.rb +56 -0
  98. metadata +142 -0
@@ -0,0 +1,113 @@
1
+ =begin rdoc
2
+
3
+ Gooby - Copyright 2007 by Chris Joakim.
4
+ Gooby is available under GNU General Public License (GPL) license.
5
+
6
+ =end
7
+
8
+ require 'gooby'
9
+
10
+ module Gooby
11
+
12
+ class ForerunnerXmlSplitter < GoobyObject
13
+
14
+ attr_reader :out_dir, :forerunner_files, :out_files_hash
15
+
16
+ def initialize(out_dir, xml_file)
17
+ @out_dir = out_dir
18
+ @forerunner_files = Array.new
19
+ @forerunner_files << xml_file
20
+ @out_files_hash = Hash.new
21
+ end
22
+
23
+ def split
24
+ @forerunner_files.each { |f| process_file(f) }
25
+ write_files
26
+ end
27
+
28
+ private
29
+
30
+ def process_file(forerunnerXmlFile)
31
+ @file_name = forerunnerXmlFile
32
+ @xml_lines = read_lines(@file_name, false)
33
+ @line_num = 0
34
+ @run_num = 0
35
+ @curr_run_lines = Array.new
36
+ @curr_run_tkpts = 0
37
+ @start_line_num = 0
38
+ @end_line_num = 0
39
+ @first_start_time = nil
40
+
41
+ @xml_lines.each { |line|
42
+ @line_num = @line_num + 1
43
+ if (line.match(/<Run>/))
44
+ @run_num = @run_num + 1
45
+ @start_line_num = @line_num
46
+ @curr_run_lines = Array.new
47
+ @curr_run_lines << line
48
+ elsif (line.match(/<StartTime>/)) # <StartTime>2007-01-13T15:37:06Z</StartTime>
49
+ @curr_run_lines << line
50
+ if @first_start_time == nil
51
+ clone = String.new(line)
52
+ clone.gsub!(/[<>]/, ' ')
53
+ clone.gsub!(/[-:T]/, '_')
54
+ clone.gsub!(/[Z]/, '')
55
+ tokens = clone.split
56
+ @first_start_time = tokens[1]
57
+ end
58
+ elsif (line.match(/<Trackpoint>/))
59
+ @curr_run_tkpts = @curr_run_tkpts + 1
60
+ @curr_run_lines << line
61
+ elsif (line.match(/<\/Run>/))
62
+ @end_line_num = @line_num
63
+ @curr_run_lines << line
64
+ end_run
65
+ elsif (@curr_run_lines.size > 0)
66
+ @curr_run_lines << line
67
+ end
68
+ }
69
+ end
70
+
71
+ def end_run
72
+ out_file = "#{@out_dir}/run_#{@first_start_time}.xml"
73
+ comment = "<!-- file: #{out_file} lines: #{@curr_run_lines.size} (#{@start_line_num} to #{@end_line_num}) tkpts: #{@curr_run_tkpts} --> \n"
74
+ @curr_run_lines.insert(0, comment)
75
+
76
+ prev_entry = @out_files_hash[out_file]
77
+ if prev_entry
78
+ if (@curr_run_lines.size >= prev_entry.size)
79
+ puts "previous entry overlaid for #{out_file}. curr=#{@curr_run_lines.size} prev=#{prev_entry.size}"
80
+ @out_files_hash[out_file] = @curr_run_lines
81
+ else
82
+ puts "previous entry retained for #{out_file}. curr=#{@curr_run_lines.size} prev=#{prev_entry.size}"
83
+ end
84
+ else
85
+ puts "new entry for #{out_file}. curr=#{@curr_run_lines.size}"
86
+ @out_files_hash[out_file] = @curr_run_lines
87
+ end
88
+
89
+ @curr_run_lines = Array.new
90
+ @curr_run_tkpts = 0
91
+ @start_line_num = 0
92
+ @end_line_num = 0
93
+ @first_start_time = nil
94
+ end
95
+
96
+ def write_files
97
+ out_names = @out_files_hash.keys.sort
98
+ puts "Writing #{out_names.size} extract files..."
99
+ out_names.each { |out_name|
100
+ lines = @out_files_hash[out_name]
101
+ out = File.new out_name, "w+"
102
+ lines.each { |line| out.write line }
103
+ out.flush
104
+ out.close
105
+ puts "File written: #{out_name}"
106
+ }
107
+ puts "output files written."
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+
@@ -0,0 +1,186 @@
1
+ =begin rdoc
2
+
3
+ Instances of this class represent a the set of Geographic data defined in file geo.txt
4
+
5
+ Gooby - Copyright 2007 by Chris Joakim.
6
+ Gooby is available under GNU General Public License (GPL) license.
7
+
8
+ =end
9
+
10
+ module Gooby
11
+
12
+ class GeoData < GoobyObject
13
+
14
+ attr_reader :filename, :lines, :poi_hash, :poi_array, :track_hash, :track_array, :route_hash, :route_array
15
+
16
+ def initialize(filename)
17
+ @filename = filename
18
+ @filename = 'data/geo_data.txt' if @filename == nil
19
+ @lines = read_lines(@filename, true)
20
+ @poi_hash = Hash.new
21
+ @poi_array = Array.new
22
+ @track_hash = Hash.new
23
+ @track_array = Array.new
24
+ @route_hash = Hash.new
25
+ @route_array = Array.new
26
+ parse_poi
27
+ parse_tracks
28
+ parse_routes
29
+ end
30
+
31
+ private
32
+
33
+ def parse_poi
34
+ in_poi, poi_number = false, 0
35
+ @lines.each { |line|
36
+ line_obj = Line.new(line, nil, true)
37
+ tok_count = line_obj.token_count
38
+ is_point = line_obj.token_idx_equals(0, '.')
39
+
40
+ if line_obj.is_populated_non_comment
41
+ if line_obj.match('points_of_interest_start')
42
+ in_poi = true
43
+ elsif line_obj.match('points_of_interest_end')
44
+ in_poi = false
45
+ elsif in_poi && tok_count > 2 && is_point
46
+ poi_number = poi_number + 1
47
+ tkpt = Trackpoint.new(
48
+ poi_number, line_obj.tokens[1], line_obj.tokens[2],
49
+ '0', '', line_obj.concatinate_tokens(3))
50
+ add_poi(tkpt)
51
+ end
52
+ end
53
+ }
54
+ end
55
+
56
+ def parse_tracks
57
+ in_track, trk_number, tkpt_number = false, 0, 0
58
+ curr_trk, curr_run = nil, nil
59
+ @lines.each { |line|
60
+ line_obj = Line.new(line, nil, true)
61
+ tok_count = line_obj.token_count
62
+ is_point = line_obj.token_idx_equals(0, '.')
63
+
64
+ if line_obj.is_populated_non_comment
65
+ if line_obj.match('track_start')
66
+ in_track = true
67
+ trk_number = trk_number + 1
68
+ tkpt_number = 0
69
+ curr_trk = Track.new(0, line_obj.concatinate_tokens(1))
70
+ curr_run = Run.new(trk_number, line_obj.concatinate_tokens(1))
71
+ curr_run.add_track(curr_trk)
72
+ elsif line_obj.match('track_end')
73
+ in_track = false
74
+ curr_run.finish
75
+ add_track(curr_trk)
76
+ add_route(curr_run)
77
+ elsif in_track && tok_count > 2 && is_point
78
+ tkpt_number = tkpt_number + 1
79
+ tkpt = Trackpoint.new(
80
+ tkpt_number, line_obj.tokens[1], line_obj.tokens[2],
81
+ '0', '', line_obj.concatinate_tokens(3))
82
+ curr_trk.add_trackpoint(tkpt)
83
+ end
84
+ end
85
+ }
86
+ end
87
+
88
+ def parse_routes
89
+ in_route, route_number, trk_number, tkpt_number = false, 0, 0, 0
90
+ curr_trk, curr_run = nil, nil
91
+ @lines.each { |line|
92
+ line_obj = Line.new(line, nil, true)
93
+ tok_count = line_obj.token_count
94
+ is_point = line_obj.token_idx_equals(0, '.')
95
+
96
+ if line_obj.is_populated_non_comment
97
+ if line_obj.match('route_start')
98
+ in_route = true
99
+ trk_number = trk_number + 1
100
+ tkpt_number = 0
101
+ curr_trk = Track.new(0, line_obj.concatinate_tokens(1))
102
+ curr_run = Run.new(trk_number, line_obj.concatinate_tokens(1))
103
+ curr_run.add_track(curr_trk)
104
+ elsif line_obj.match('route_end')
105
+ in_route = false
106
+ curr_run.finish
107
+ add_route(curr_run)
108
+ elsif in_route && tok_count > 2 && is_point
109
+ tkpt_number = tkpt_number + 1
110
+ tkpt = Trackpoint.new(
111
+ tkpt_number, line_obj.tokens[1], line_obj.tokens[2],
112
+ '0', '', line_obj.concatinate_tokens(3))
113
+ curr_trk.add_trackpoint(tkpt)
114
+ elsif in_route && line_obj.token_idx_equals(0, 'track') && tok_count > 1
115
+ trk_desc = line_obj.concatinate_tokens(1)
116
+ trk = @track_hash[trk_desc]
117
+ if trk
118
+ trk.trackpoints.each { |tkpt| curr_trk.add_trackpoint(tkpt) }
119
+ end
120
+ elsif in_route && line_obj.token_idx_equals(0, 'track_rev') && tok_count > 1
121
+ trk_desc = line_obj.concatinate_tokens(1)
122
+ trk = @track_hash[trk_desc]
123
+ if trk
124
+ array = trk.trackpoints
125
+ trk.trackpoints.each { |tkpt| curr_trk.add_trackpoint(tkpt) }
126
+ end
127
+ end
128
+ end
129
+ }
130
+ end
131
+
132
+ def add_poi(tkpt)
133
+ if tkpt
134
+ descr = tkpt.descr
135
+ if @poi_hash.has_key? descr
136
+ puts "Duplicate POI key ignored - '#{descr}'"
137
+ else
138
+ #puts "Adding POI: #{tkpt.to_poi_csv}"
139
+ @poi_hash[descr] = tkpt
140
+ @poi_array << tkpt
141
+ end
142
+ end
143
+ end
144
+
145
+ def add_track(trk)
146
+ if trk
147
+ descr = trk.descr
148
+ if @track_hash.has_key? descr
149
+ puts "Duplicate Track key ignored - '#{descr}'"
150
+ else
151
+ @track_hash[descr] = trk
152
+ @track_array << trk
153
+ end
154
+ end
155
+ end
156
+
157
+ def add_route(run)
158
+ if run
159
+ descr = run.descr
160
+ if @route_hash.has_key? descr
161
+ puts "Duplicate Route key ignored - '#{descr}'"
162
+ else
163
+ @route_hash[descr] = run
164
+ @route_array << run
165
+ end
166
+ end
167
+ end
168
+
169
+ public
170
+
171
+ def to_s
172
+ return "GeoData lines: #{lines.size} poi: #{@poi_hash.size} tracks: #{@track_hash.size} routes: #{@route_hash.size} "
173
+ end
174
+
175
+ def dump
176
+ puts "#{self.class} dump:"
177
+ @poi_array.each { |tkpt| puts "POI: #{tkpt.to_geo_s}" }
178
+ @track_array.each { |trk| trk.dump }
179
+ @route_hash.keys.sort.each { |key|
180
+ puts "Route: '#{key}'"
181
+ }
182
+ end
183
+
184
+ end
185
+
186
+ end
@@ -0,0 +1,23 @@
1
+ =begin rdoc
2
+
3
+ This is the abstract superclass of several Gooby classes.
4
+ Includes modules GoobyIO, Introspect, and GoobyProjectInfo.
5
+
6
+ Gooby - Copyright 2007 by Chris Joakim.
7
+ Gooby is available under GNU General Public License (GPL) license.
8
+
9
+ =end
10
+
11
+ module Gooby
12
+
13
+ class GoobyObject
14
+
15
+ include Gooby::GoobyIO
16
+ include Gooby::GoobyString
17
+ include Gooby::Introspect
18
+ include Gooby::GoobyProjectInfo
19
+ include Gooby::Constants
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,368 @@
1
+ =begin rdoc
2
+
3
+ Instances of this class represent a <Run> aggregate object from a
4
+ Forerunner XML file.
5
+
6
+ Additionally, there is distance, pace, and Google Map generation logic
7
+ in this class.
8
+
9
+ Gooby - Copyright 2007 by Chris Joakim.
10
+ Gooby is available under GNU General Public License (GPL) license.
11
+
12
+ =end
13
+
14
+ module Gooby
15
+
16
+ class GoogleMapGenerator < GoobyObject
17
+
18
+ attr_reader :csv_file, :csv_lines, :dttm_idx, :num_idx, :lat_idx, :lng_idx, :alt_idx, :cdist_idx
19
+ attr_reader :run, :tkpts, :content_hash, :center_longitude, :center_latitude, :gpoint_array, :overlay_points, :notes
20
+ attr_reader :center_longitude, :center_latitude
21
+
22
+ # The default csv input file format is as follows:
23
+ # 1 | 2006-01-15T18:31:10Z | 1279 | 33.42601 | -111.92927 | 347.654 | 26.3514930151813
24
+ # 1 | 2004-11-13T13:05:20Z | 2 | 37.54318 | -77.43636 | -58.022 | 0.00297286231747969
25
+
26
+ def initialize(csv_file, dttm_idx=1, num_idx=2, lat_idx=3, lng_idx=4, alt_idx=5, cdist_idx=6)
27
+ @csv_file = csv_file
28
+ @dttm_idx = dttm_idx
29
+ @num_idx = num_idx
30
+ @lat_idx = lat_idx
31
+ @lng_idx = lng_idx
32
+ @alt_idx = alt_idx
33
+ @cdist_idx = cdist_idx
34
+ @options = Gooby::Options.new(nil)
35
+ @content_hash = Hash.new('')
36
+ @run = Gooby::Run.new(1)
37
+ @track = Gooby::Track.new(1)
38
+ @run.add_track(@track)
39
+ @tkpts = Array.new
40
+
41
+ @csv_lines = read_as_ascii_lines(@csv_file, 10, true)
42
+ @csv_lines.each { | line |
43
+ dline = Gooby::DelimLine.new(line)
44
+ if (!dline.is_comment?)
45
+ tkpt = dline.as_trackpoint(@num_idx, @lat_idx, @lng_idx, @alt_idx, @dttm_idx)
46
+ if tkpt
47
+ @track.add_trackpoint(tkpt)
48
+ end
49
+ end
50
+ }
51
+ @run.finish
52
+ end
53
+
54
+ =begin
55
+ Returns a Hash with specific generated content at the following keys:
56
+ =end
57
+ def generate(options)
58
+ if (options == nil)
59
+ @options = Gooby::Options.new(nil)
60
+ else
61
+ @options = options
62
+ end
63
+ @content_hash['when_generated'] = Time.now
64
+ @content_hash['title'] = @options.get('gmap_title')
65
+ filter_trackpoints
66
+ compute_center_point
67
+ generate_key_js
68
+ generate_map_div
69
+ generate_messages_div
70
+ generate_main_js_start
71
+ generate_main_js_route_overlay
72
+ generate_main_js_checkpoint_overlays
73
+ generate_main_js_map_clicked_listeners
74
+ generate_main_js_end
75
+ @content_hash
76
+ end
77
+
78
+ def filter_trackpoints
79
+ count, @tkpts = 0, Array.new
80
+ firstTkpt = @options.get('gmap_first_tkpt_number')
81
+ lastTkpt = @options.get('gmap_last_tkpt_number')
82
+ @run.tracks.each { |trk|
83
+ trk.trackpoints.each { |tkpt|
84
+ count = count + 1
85
+ if ((count >= firstTkpt) && (count <= lastTkpt))
86
+ @tkpts.push(tkpt)
87
+ end
88
+ }
89
+ }
90
+ end
91
+
92
+ =begin
93
+ Returns a Hash with specific generated content at the following keys:
94
+ =end
95
+ def generate_page(options)
96
+
97
+ # puts "generate_page #{@csv_file} #{@csv_lines.size}"
98
+ content_hash = generate(nil)
99
+ s = String.new(@csv_file)
100
+ s.gsub("/", " ")
101
+ tokens = tokenize(s, nil)
102
+ out_file = "#{tokens[-2]}.html"
103
+ #content_hash.keys.sort.each { | key | puts key }
104
+
105
+ s = <<HERE
106
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
107
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
108
+ <html xmlns="http://www.w3.org/1999/xhtml">
109
+ <head>
110
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
111
+ <title> Google Map by Gooby </title>
112
+ #{content_hash['key_js']}
113
+ #{content_hash['main_js_start']}
114
+ #{content_hash['main_js_route_overlay']}
115
+ #{content_hash['main_js_checkpoint_overlays']}
116
+ #{content_hash['main_js_map_clicked_listeners']}
117
+ #{content_hash['main_js_end']}
118
+ </head>
119
+ <body onload="load()" onunload="GUnload()">
120
+ <center>
121
+ <h3> #{content_hash['title']} </h3>
122
+ <h5> Generated by Gooby #{content_hash['when_generated']} <br> Gooby = Google APIs + Ruby </h5>
123
+ #{content_hash['map_div']}
124
+ #{content_hash['messages_div']}
125
+ </center>
126
+ </body>
127
+ </html>
128
+ HERE
129
+
130
+ # html_file = File.new(out_file, "w+")
131
+ # html_file.write(s)
132
+ # html_file.flush
133
+ # html_file.close
134
+ puts s # Output is redirected by shell.
135
+ end
136
+
137
+ private
138
+
139
+ def compute_center_point
140
+ highLat = -999.0
141
+ highLong = -999.0
142
+ lowLat = 999.0
143
+ lowLong = 999.0
144
+ @tkpts.each { |tkpt|
145
+ highLat = tkpt.latitude_as_float if tkpt.latitude_as_float > highLat
146
+ lowLat = tkpt.latitude_as_float if tkpt.latitude_as_float < lowLat
147
+ highLong = tkpt.longitude_as_float if tkpt.longitude_as_float > highLong
148
+ lowLong = tkpt.longitude_as_float if tkpt.longitude_as_float < lowLong
149
+ }
150
+ @center_longitude = (highLong + lowLong) / 2
151
+ @center_latitude = (highLat + lowLat) / 2
152
+ @content_hash['center_longitude'] = @center_longitude
153
+ @content_hash['center_latitude'] = @center_latitude
154
+ end
155
+
156
+ def generate_key_js
157
+ key = @options.get('gmap_key')
158
+ key.strip!
159
+ s = '<script src="http://maps.google.com/maps?file=api&v=2&key='
160
+ s << key
161
+ s << '" type="text/javascript"></script>'
162
+ @content_hash['key_js'] = s
163
+ end
164
+
165
+ def generate_map_div
166
+ width = @options.get('gmap_width')
167
+ height = @options.get('gmap_height')
168
+ id = @options.get('gmap_map_element_id')
169
+ s = '<div id="'
170
+ s << id
171
+ s << '" style="width: '
172
+ s << width
173
+ s << '; height: '
174
+ s << height
175
+ s << '"></div>'
176
+ @content_hash['map_width'] = width
177
+ @content_hash['map_height'] = height
178
+ @content_hash['map_div'] = s
179
+ end
180
+
181
+ def generate_messages_div
182
+ s = "<div id=\"messages\"></div>"
183
+ @content_hash['messages_div'] = s
184
+ end
185
+
186
+ def generate_main_js_start
187
+ id = @options.get('gmap_map_element_id')
188
+ size = @options.get('gmap_size_control')
189
+ type = @options.get('gmap_type')
190
+ zoom = @options.get('gmap_zoom_level')
191
+ title = @options.get('gmap_title')
192
+ if size
193
+ if size == 'smallmap'
194
+ size = 'GSmallMapControl'
195
+ elsif size == 'smallzoom'
196
+ size = 'GSmallMapControl'
197
+ else
198
+ size = 'GLargeMapControl'
199
+ end
200
+ end
201
+
202
+ if type
203
+ if type == 'satellite'
204
+ type = 'G_SATELLITE_MAP'
205
+ elsif type == 'hybrid'
206
+ type = 'G_HYBRID_MAP'
207
+ else
208
+ type = 'G_NORMAL_MAP'
209
+ end
210
+ else
211
+ type = 'G_NORMAL_MAP'
212
+ end
213
+
214
+ s = '<script type="text/javascript">'
215
+ s << "\n"
216
+ s << "//<![CDATA[ \n"
217
+ s << " function load() { \n"
218
+ s << " if (GBrowserIsCompatible()) { \n"
219
+ s << ' var map = new GMap2(document.getElementById("'
220
+ s << id
221
+ s << '")); '
222
+ s << "\n"
223
+
224
+ if size
225
+ s << ' map.addControl(new '
226
+ s << size
227
+ s << '());'
228
+ s << "\n"
229
+ end
230
+
231
+ if type
232
+ s << ' map.addControl(new GMapTypeControl());'
233
+ s << "\n"
234
+ # s << ' map.setMapType('
235
+ # s << type
236
+ # s << ');'
237
+ s << "\n"
238
+ end
239
+ s << " var centerPoint = new GLatLng(#{@center_latitude}, #{@center_longitude}); \n"
240
+ s << " map.setCenter(centerPoint, #{zoom}); \n"
241
+ s << "\n"
242
+ @content_hash['main_js_start'] = s
243
+ @content_hash['title'] = title
244
+ end
245
+
246
+ def generate_main_js_route_overlay
247
+ tkpt_count = @tkpts.size.to_f
248
+ app_max = @options.get('gmap_approx_max_points').to_f
249
+ comments = @options.get('gmap_gen_comments')
250
+ ratio = tkpt_count / app_max
251
+ @start_dttm = nil
252
+ if ratio > 1.0
253
+ increment = (tkpt_count / app_max).to_i
254
+ else
255
+ increment = 1
256
+ end
257
+ curr_idx, next_idx, gpoint_count, last_idx = -1, 0, 0, @tkpts.size - 1
258
+ s = " var points = new Array(); "
259
+ @tkpts.each { |tkpt|
260
+ curr_idx = curr_idx + 1
261
+ if curr_idx == 0
262
+ @start_dttm = tkpt.dttm
263
+ @start_pos = tkpt.position
264
+ time = Time.parse(@start_dttm.dateTime().to_s)
265
+ end
266
+ if ((curr_idx == next_idx) || (curr_idx == last_idx) || (tkpt.is_split()))
267
+ gpoint_count = gpoint_count + 1
268
+ s << tkpt.as_glatlng(comments, tkpt_count, curr_idx, gpoint_count, @start_dttm)
269
+ next_idx = curr_idx + increment
270
+ end
271
+ }
272
+ s << "\n"
273
+ s << "\n var routePolyline = new GPolyline(points); "
274
+ s << "\n map.addOverlay(routePolyline); "
275
+ @content_hash['main_js_route_overlay'] = s
276
+ @content_hash['main_js_route_overlay_increment'] = increment
277
+ end
278
+
279
+ def generate_main_js_checkpoint_overlays
280
+ s = "\n // Create a base icon for all of our markers that specifies the "
281
+ s << "\n // shadow, icon dimensions, etc."
282
+ s << "\n var baseIcon = new GIcon();"
283
+ s << "\n baseIcon.shadow = \"http://www.joakim-systems.com/gicons/shadow50.png\";"
284
+ s << "\n baseIcon.iconSize = new GSize(20, 34);"
285
+ s << "\n baseIcon.shadowSize = new GSize(37, 34);"
286
+ s << "\n baseIcon.iconAnchor = new GPoint(9, 34);"
287
+ s << "\n baseIcon.infoWindowAnchor = new GPoint(9, 2);"
288
+ s << "\n baseIcon.infoShadowAnchor = new GPoint(18, 25);"
289
+ s << "\n"
290
+
291
+ curr_idx = -1
292
+ last_idx = @tkpts.size - 1
293
+ next_checkpoint = 0.0
294
+ @start_dttm = nil
295
+ @tkpts.each { | tkpt |
296
+ curr_idx = curr_idx + 1
297
+ if curr_idx == 0
298
+ @start_dttm = tkpt.dttm
299
+ info_window_html = tkpt.as_info_window_html('Start', @start_dttm)
300
+ s << "\n var iconStart = new GIcon(baseIcon); "
301
+ s << "\n iconStart.image = \"http://www.joakim-systems.com/gicons/dd-start.png\";"
302
+ s << "\n var pStart = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
303
+ s << "\n var mStart = new GMarker(pStart, iconStart);"
304
+ s << "\n GEvent.addListener(mStart, \"click\", function() { "
305
+ s << "\n mStart.openInfoWindowHtml(#{info_window_html});"
306
+ s << "\n }); "
307
+ s << "\n map.addOverlay(mStart);"
308
+ s << "\n "
309
+ next_checkpoint = 1.0
310
+ elsif curr_idx == last_idx
311
+ info_window_html = tkpt.as_info_window_html('Finish', @start_dttm)
312
+ s << "\n var iconFinish = new GIcon(baseIcon); "
313
+ s << "\n iconFinish.image = \"http://www.joakim-systems.com/gicons/dd-end.png\";"
314
+ s << "\n var pFinish = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
315
+ s << "\n var mFinish = new GMarker(pFinish, iconFinish);"
316
+ s << "\n GEvent.addListener(mFinish, \"click\", function() { "
317
+ s << "\n mFinish.openInfoWindowHtml(#{info_window_html});"
318
+ s << "\n }); "
319
+ s << "\n map.addOverlay(mFinish);"
320
+ s << "\n "
321
+ next_checkpoint = 999999
322
+ else
323
+ if (tkpt.cumulativeDistance >= next_checkpoint)
324
+ integer = next_checkpoint.to_i
325
+ info_window_html = tkpt.as_info_window_html("#{integer}", @start_dttm)
326
+ s << "\n var icon#{integer} = new GIcon(baseIcon); "
327
+ s << "\n icon#{integer}.image = \"http://www.joakim-systems.com/gicons/marker#{integer}.png\";"
328
+ s << "\n var p#{integer} = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
329
+ s << "\n var m#{integer} = new GMarker(p#{integer}, icon#{integer});"
330
+ s << "\n GEvent.addListener(m#{integer}, \"click\", function() { "
331
+ s << "\n m#{integer}.openInfoWindowHtml(#{info_window_html});"
332
+ s << "\n }); "
333
+ s << "\n map.addOverlay(m#{integer});"
334
+ s << "\n "
335
+ next_checkpoint = next_checkpoint + 1.0
336
+ end
337
+ end
338
+ }
339
+ s << "\n"
340
+ @content_hash['main_js_checkpoint_overlays'] = s
341
+
342
+ end
343
+
344
+ def generate_main_js_map_clicked_listeners
345
+ s = "\n"
346
+ s << "\n GEvent.addListener(map, \"click\", function() { "
347
+ s << "\n var center = map.getCenter(); \n"
348
+ s << "\n document.getElementById(\"messages\").innerHTML = 'click: ' + center.toString(); "
349
+ s << "\n });"
350
+ s << "\n GEvent.addListener(map, \"moveend\", function() { "
351
+ s << "\n var center = map.getCenter(); \n"
352
+ s << "\n document.getElementById(\"messages\").innerHTML = 'moveend: ' + center.toString(); "
353
+ s << "\n });"
354
+ @content_hash['main_js_map_clicked_listeners'] = s
355
+ end
356
+
357
+ def generate_main_js_end
358
+ s = "\n } "
359
+ s << "\n } "
360
+ s << "\n//]]> \n"
361
+ s << "\n</script>"
362
+
363
+ @content_hash['main_js_end'] = s
364
+ end
365
+
366
+ end
367
+
368
+ end