gooby 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +133 -341
- data/config/ballantyne.yaml +11 -0
- data/config/big_sur_marathon.yaml +11 -0
- data/config/crowders_mtn_hike.yaml +11 -0
- data/config/davidson1.yaml +16 -0
- data/config/gooby_config.yaml +28 -135
- data/cucumber.yml +1 -0
- data/features/build_gem.feature +88 -0
- data/features/gooby.feature +300 -0
- data/features/install.feature +78 -0
- data/features/steps/gooby_steps.rb +245 -0
- data/features/support/env.rb +4 -0
- data/lib/gooby.rb +24 -30
- data/lib/gooby_activity.rb +63 -0
- data/lib/gooby_base_object.rb +46 -0
- data/lib/gooby_base_sax_parser.rb +95 -0
- data/lib/gooby_configuration.rb +33 -115
- data/lib/gooby_counter_hash.rb +28 -87
- data/lib/gooby_dttm.rb +88 -66
- data/lib/gooby_environment.rb +48 -0
- data/lib/gooby_garmin_tcx_parser.rb +92 -0
- data/lib/gooby_google_kml_generator.rb +168 -0
- data/lib/gooby_google_map_generator.rb +284 -349
- data/lib/gooby_gpx_parser.rb +97 -0
- data/lib/gooby_help_producer.rb +40 -0
- data/lib/gooby_introspection.rb +25 -0
- data/lib/gooby_io.rb +30 -0
- data/lib/gooby_lap.rb +27 -18
- data/lib/gooby_process.rb +281 -0
- data/lib/gooby_sax_path_parser.rb +43 -0
- data/lib/gooby_tcx_extractor.rb +71 -0
- data/lib/gooby_track_log_parser.rb +114 -0
- data/lib/gooby_trackpoint.rb +276 -0
- data/lib/gooby_xml_object.rb +40 -0
- data/{img/gicons → out/images}/blank.png +0 -0
- data/{img/gicons → out/images}/dd-end.png +0 -0
- data/{img/gicons → out/images}/dd-start.png +0 -0
- data/{img/gicons → out/images}/marker.png +0 -0
- data/{img/gicons → out/images}/marker0.png +0 -0
- data/{img/gicons → out/images}/marker00.png +0 -0
- data/{img/gicons → out/images}/marker01.png +0 -0
- data/{img/gicons → out/images}/marker02.png +0 -0
- data/{img/gicons → out/images}/marker03.png +0 -0
- data/{img/gicons → out/images}/marker04.png +0 -0
- data/{img/gicons → out/images}/marker05.png +0 -0
- data/{img/gicons → out/images}/marker06.png +0 -0
- data/{img/gicons → out/images}/marker07.png +0 -0
- data/{img/gicons → out/images}/marker08.png +0 -0
- data/{img/gicons → out/images}/marker09.png +0 -0
- data/{img/gicons → out/images}/marker1.png +0 -0
- data/{img/gicons → out/images}/marker10.png +0 -0
- data/{img/gicons → out/images}/marker11.png +0 -0
- data/{img/gicons → out/images}/marker12.png +0 -0
- data/{img/gicons → out/images}/marker13.png +0 -0
- data/{img/gicons → out/images}/marker14.png +0 -0
- data/{img/gicons → out/images}/marker15.png +0 -0
- data/{img/gicons → out/images}/marker16.png +0 -0
- data/{img/gicons → out/images}/marker17.png +0 -0
- data/{img/gicons → out/images}/marker18.png +0 -0
- data/{img/gicons → out/images}/marker19.png +0 -0
- data/{img/gicons → out/images}/marker2.png +0 -0
- data/{img/gicons → out/images}/marker20.png +0 -0
- data/{img/gicons → out/images}/marker21.png +0 -0
- data/{img/gicons → out/images}/marker22.png +0 -0
- data/{img/gicons → out/images}/marker23.png +0 -0
- data/{img/gicons → out/images}/marker24.png +0 -0
- data/{img/gicons → out/images}/marker25.png +0 -0
- data/{img/gicons → out/images}/marker26.png +0 -0
- data/{img/gicons → out/images}/marker27.png +0 -0
- data/{img/gicons → out/images}/marker28.png +0 -0
- data/{img/gicons → out/images}/marker29.png +0 -0
- data/{img/gicons → out/images}/marker3.png +0 -0
- data/{img/gicons → out/images}/marker30.png +0 -0
- data/{img/gicons → out/images}/marker31.png +0 -0
- data/{img/gicons → out/images}/marker32.png +0 -0
- data/{img/gicons → out/images}/marker33.png +0 -0
- data/{img/gicons → out/images}/marker34.png +0 -0
- data/{img/gicons → out/images}/marker35.png +0 -0
- data/{img/gicons → out/images}/marker36.png +0 -0
- data/{img/gicons → out/images}/marker37.png +0 -0
- data/{img/gicons → out/images}/marker38.png +0 -0
- data/{img/gicons → out/images}/marker39.png +0 -0
- data/{img/gicons → out/images}/marker4.png +0 -0
- data/{img/gicons → out/images}/marker40.png +0 -0
- data/{img/gicons → out/images}/marker41.png +0 -0
- data/{img/gicons → out/images}/marker42.png +0 -0
- data/{img/gicons → out/images}/marker43.png +0 -0
- data/{img/gicons → out/images}/marker44.png +0 -0
- data/{img/gicons → out/images}/marker45.png +0 -0
- data/{img/gicons → out/images}/marker46.png +0 -0
- data/{img/gicons → out/images}/marker47.png +0 -0
- data/{img/gicons → out/images}/marker48.png +0 -0
- data/{img/gicons → out/images}/marker49.png +0 -0
- data/{img/gicons → out/images}/marker5.png +0 -0
- data/{img/gicons → out/images}/marker50.png +0 -0
- data/{img/gicons → out/images}/marker51.png +0 -0
- data/{img/gicons → out/images}/marker52.png +0 -0
- data/{img/gicons → out/images}/marker53.png +0 -0
- data/{img/gicons → out/images}/marker54.png +0 -0
- data/{img/gicons → out/images}/marker55.png +0 -0
- data/{img/gicons → out/images}/marker56.png +0 -0
- data/{img/gicons → out/images}/marker57.png +0 -0
- data/{img/gicons → out/images}/marker58.png +0 -0
- data/{img/gicons → out/images}/marker59.png +0 -0
- data/{img/gicons → out/images}/marker6.png +0 -0
- data/{img/gicons → out/images}/marker60.png +0 -0
- data/{img/gicons → out/images}/marker61.png +0 -0
- data/{img/gicons → out/images}/marker62.png +0 -0
- data/{img/gicons → out/images}/marker63.png +0 -0
- data/{img/gicons → out/images}/marker64.png +0 -0
- data/{img/gicons → out/images}/marker65.png +0 -0
- data/{img/gicons → out/images}/marker66.png +0 -0
- data/{img/gicons → out/images}/marker67.png +0 -0
- data/{img/gicons → out/images}/marker68.png +0 -0
- data/{img/gicons → out/images}/marker69.png +0 -0
- data/{img/gicons → out/images}/marker7.png +0 -0
- data/{img/gicons → out/images}/marker70.png +0 -0
- data/{img/gicons → out/images}/marker71.png +0 -0
- data/{img/gicons → out/images}/marker72.png +0 -0
- data/{img/gicons → out/images}/marker73.png +0 -0
- data/{img/gicons → out/images}/marker74.png +0 -0
- data/{img/gicons → out/images}/marker75.png +0 -0
- data/{img/gicons → out/images}/marker76.png +0 -0
- data/{img/gicons → out/images}/marker77.png +0 -0
- data/{img/gicons → out/images}/marker78.png +0 -0
- data/{img/gicons → out/images}/marker79.png +0 -0
- data/{img/gicons → out/images}/marker8.png +0 -0
- data/{img/gicons → out/images}/marker80.png +0 -0
- data/{img/gicons → out/images}/marker81.png +0 -0
- data/{img/gicons → out/images}/marker82.png +0 -0
- data/{img/gicons → out/images}/marker83.png +0 -0
- data/{img/gicons → out/images}/marker84.png +0 -0
- data/{img/gicons → out/images}/marker85.png +0 -0
- data/{img/gicons → out/images}/marker86.png +0 -0
- data/{img/gicons → out/images}/marker87.png +0 -0
- data/{img/gicons → out/images}/marker88.png +0 -0
- data/{img/gicons → out/images}/marker89.png +0 -0
- data/{img/gicons → out/images}/marker9.png +0 -0
- data/{img/gicons → out/images}/marker90.png +0 -0
- data/{img/gicons → out/images}/marker91.png +0 -0
- data/{img/gicons → out/images}/marker92.png +0 -0
- data/{img/gicons → out/images}/marker93.png +0 -0
- data/{img/gicons → out/images}/marker94.png +0 -0
- data/{img/gicons → out/images}/marker95.png +0 -0
- data/{img/gicons → out/images}/marker96.png +0 -0
- data/{img/gicons → out/images}/marker97.png +0 -0
- data/{img/gicons → out/images}/marker98.png +0 -0
- data/{img/gicons → out/images}/marker99.png +0 -0
- data/{img/gicons → out/images}/markerA.png +0 -0
- data/{img/gicons → out/images}/markerB.png +0 -0
- data/{img/gicons → out/images}/markerC.png +0 -0
- data/{img/gicons → out/images}/markerD.png +0 -0
- data/{img/gicons → out/images}/markerE.png +0 -0
- data/{img/gicons → out/images}/markerF.png +0 -0
- data/{img/gicons → out/images}/markerG.png +0 -0
- data/{img/gicons → out/images}/markerH.png +0 -0
- data/{img/gicons → out/images}/markerI.png +0 -0
- data/{img/gicons → out/images}/markerJ.png +0 -0
- data/{img/gicons → out/images}/mm_20_red.png +0 -0
- data/{img/gicons → out/images}/mm_20_shadow.png +0 -0
- data/{img/gicons → out/images}/shadow50.png +0 -0
- data/rakefile.rb +79 -0
- data/samples.sh +21 -0
- data/samples/2008_04_27_13_49_50_tcx.csv +2449 -0
- data/samples/2008_04_27_13_49_50_tcx.xml +24560 -0
- data/samples/2009_01_01_14_45_00_tcx.xml +10630 -0
- data/samples/ballantyne.csv +27 -0
- data/samples/ballantyne.gpx +117 -0
- data/samples/ballantyne.kml +91 -0
- data/samples/big_sur_marathon.html +2766 -0
- data/samples/big_sur_marathon.kml +685 -0
- data/samples/build_gem_test_results.txt +6 -0
- data/samples/crowders_mtn_hike.csv +1065 -0
- data/samples/crowders_mtn_hike.html +1283 -0
- data/samples/crowders_mtn_hike.log +1 -0
- data/samples/cucumber_test_results.txt +302 -0
- data/samples/davidson1.csv +1 -0
- data/samples/davidson1.html +75 -0
- data/samples/davidson_1_point_tcx.csv +0 -0
- data/samples/doc.kml +49 -0
- data/samples/gps_track_log_asheville_mt_pisgah.txt +1 -0
- data/samples/gps_track_logs.txt +1 -0
- data/samples/install_test_results.txt +81 -0
- data/samples/mt_pisgah.txt +1 -0
- data/samples/rspec_test_results.txt +5 -0
- data/setup.rb +66 -0
- data/spec/gooby_base_object_spec.rb +116 -0
- data/spec/gooby_counter_hash_spec.rb +34 -0
- data/spec/gooby_dttm_spec.rb +40 -0
- data/spec/gooby_spec_helper.rb +9 -0
- data/spec/gooby_xml_object_spec.rb +32 -0
- metadata +225 -226
- data/bin/code_scan.rb +0 -16
- data/bin/gooby_been_there.rb +0 -33
- data/bin/gooby_config.rb +0 -24
- data/bin/gooby_csv_validation.rb +0 -50
- data/bin/gooby_first_trackpoints_as_poi.rb +0 -31
- data/bin/gooby_gen_gmap.rb +0 -20
- data/bin/gooby_parser.rb +0 -21
- data/bin/gooby_splitter.rb +0 -21
- data/bin/gooby_version.rb +0 -20
- data/bin/run_all.sh +0 -33
- data/bin/run_been_there.sh +0 -19
- data/bin/run_config.sh +0 -12
- data/bin/run_csv_validation.sh +0 -15
- data/bin/run_db_gen.sh +0 -11
- data/bin/run_db_load.sh +0 -11
- data/bin/run_first_trackpoints_as_poi.sh +0 -16
- data/bin/run_gen_gmaps.sh +0 -21
- data/bin/run_parse_full.sh +0 -45
- data/bin/run_parse_samples.sh +0 -21
- data/bin/run_split.sh +0 -24
- data/bin/run_version.sh +0 -12
- data/data/20050305_corporate_cup_hm.csv +0 -251
- data/data/20050305_corporate_cup_hm.xml +0 -2208
- data/data/20050430_nashville_marathon.xml +0 -10043
- data/data/20050430_nashville_marathon_km.csv +0 -1208
- data/data/20060115_phoenix_marathon.csv +0 -1280
- data/data/20060115_phoenix_marathon.xml +0 -10620
- data/data/20070101_davidson_11m.csv +0 -251
- data/data/20070101_davidson_11m.xml +0 -2020
- data/data/20070505_davidson_5k.xml +0 -2875
- data/data/20070505_davidson_5k_km.csv +0 -286
- data/data/hrm1.csv +0 -5
- data/img/gicons/readme.txt +0 -14
- data/lib/gooby_code_scanner.rb +0 -288
- data/lib/gooby_command.rb +0 -210
- data/lib/gooby_course.rb +0 -117
- data/lib/gooby_csv_point.rb +0 -71
- data/lib/gooby_csv_reader.rb +0 -71
- data/lib/gooby_csv_run.rb +0 -28
- data/lib/gooby_delim_line.rb +0 -42
- data/lib/gooby_duration.rb +0 -86
- data/lib/gooby_forerunner_xml_parser.rb +0 -191
- data/lib/gooby_forerunner_xml_splitter.rb +0 -115
- data/lib/gooby_history.rb +0 -41
- data/lib/gooby_kernel.rb +0 -163
- data/lib/gooby_line.rb +0 -80
- data/lib/gooby_object.rb +0 -22
- data/lib/gooby_point.rb +0 -172
- data/lib/gooby_run.rb +0 -213
- data/lib/gooby_simple_xml_parser.rb +0 -50
- data/lib/gooby_test_helper.rb +0 -23
- data/lib/gooby_track.rb +0 -47
- data/lib/gooby_track_point.rb +0 -229
- data/lib/gooby_training_center_xml_parser.rb +0 -224
- data/lib/gooby_training_center_xml_splitter.rb +0 -116
- data/lib/split_code.sh +0 -29
- data/samples/20050305_corporate_cup_hm.html +0 -450
- data/samples/20050430_nashville_marathon.html +0 -1668
- data/samples/20060115_phoenix_marathon.html +0 -1596
- data/samples/20070101_davidson_11m.html +0 -432
- data/samples/20070505_davidson_5k.html +0 -413
- data/samples/been_there.txt +0 -92
- data/samples/hrm1.html +0 -87
- data/sql/gooby.ddl +0 -60
- data/sql/gooby_load.dml +0 -62
@@ -0,0 +1,48 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Gooby = Google APIs + Ruby. Copyright 2009 by Chris Joakim.
|
4
|
+
Gooby is available under GNU General Public License (GPL) license.
|
5
|
+
|
6
|
+
=end
|
7
|
+
|
8
|
+
module GoobyEnvironment
|
9
|
+
|
10
|
+
def command_line_arg(arg_name, default_value=nil)
|
11
|
+
value = ENV[arg_name]
|
12
|
+
(value.nil?) ? default_value : value
|
13
|
+
end
|
14
|
+
|
15
|
+
def boolean_param(name, default=false)
|
16
|
+
value = ENV[name.to_s]
|
17
|
+
return default if value.nil?
|
18
|
+
return true if (value.downcase == 'true') || (value.downcase == 't')
|
19
|
+
return false if (value.downcase == 'false') || (value.downcase == 'f')
|
20
|
+
default
|
21
|
+
end
|
22
|
+
|
23
|
+
def integer_param(name, default=0)
|
24
|
+
(ENV[name.to_s]) ? ENV[name.to_s].to_i : default.to_i
|
25
|
+
end
|
26
|
+
|
27
|
+
def float_param(name, default=0.0)
|
28
|
+
(ENV[name.to_s]) ? ENV[name.to_s].to_f : default.to_f
|
29
|
+
end
|
30
|
+
|
31
|
+
def string_param(name, default='')
|
32
|
+
(ENV[name.to_s]) ? ENV[name.to_s] : default.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
def array_param(name, default=[])
|
36
|
+
array = []
|
37
|
+
csv_value = string_param(name.to_s, nil)
|
38
|
+
if csv_value
|
39
|
+
FasterCSV.parse(csv_value) do | row |
|
40
|
+
row.each { | value | array << value }
|
41
|
+
end
|
42
|
+
array
|
43
|
+
else
|
44
|
+
default
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Gooby = Google APIs + Ruby. Copyright 2009 by Chris Joakim.
|
4
|
+
Gooby is available under GNU General Public License (GPL) license.
|
5
|
+
|
6
|
+
---
|
7
|
+
|
8
|
+
This class is used to parse a Garmin tcx xml file, such as from a Garmin 305 device
|
9
|
+
as exported by the Garmin Training Center software.
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
class GoobyGarminTcxParser < GoobyBaseSaxParser
|
14
|
+
|
15
|
+
def subclass_initialize
|
16
|
+
@tags, @activities, @mappings = [], [], {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def on_start_element(name, attributes, prefix=nil, uri=nil, namespaces=nil)
|
20
|
+
@tags.push(name)
|
21
|
+
@current_text = ''
|
22
|
+
path = current_path
|
23
|
+
if path == 'TrainingCenterDatabase|Activities|Activity'
|
24
|
+
@current_activity = GoobyActivity.new(attributes)
|
25
|
+
@activities << @current_activity
|
26
|
+
|
27
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap'
|
28
|
+
@current_lap = GoobyLap.new(attributes)
|
29
|
+
@current_activity.add_lap(@current_lap)
|
30
|
+
|
31
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|Track|Trackpoint'
|
32
|
+
@current_trackpoint = GoobyTrackpoint.new
|
33
|
+
@current_trackpoint.set('ActivityId', @current_activity.id)
|
34
|
+
@current_trackpoint.set('LapSeq', @current_lap.sequence)
|
35
|
+
@current_trackpoint.set('LapStartTime', @current_lap.start_time)
|
36
|
+
@current_activity.add_trackpoint(@current_trackpoint)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_end_element(name, prefix=nil, uri=nil)
|
41
|
+
path = current_path
|
42
|
+
# Activity
|
43
|
+
if path == 'TrainingCenterDatabase|Activities|Activity|Id'
|
44
|
+
@current_activity.set(name, get_current_text)
|
45
|
+
|
46
|
+
# Lap
|
47
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|DistanceMeters'
|
48
|
+
@current_lap.set(name, get_current_text)
|
49
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|MaximumSpeed'
|
50
|
+
@current_lap.set(name, get_current_text)
|
51
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|TotalTimeSeconds'
|
52
|
+
@current_lap.set(name, get_current_text)
|
53
|
+
|
54
|
+
# Trackpoint
|
55
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|Track|Trackpoint|Time'
|
56
|
+
@current_trackpoint.set(name, get_current_text)
|
57
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|Track|Trackpoint|Position|LatitudeDegrees'
|
58
|
+
@current_trackpoint.set(name, get_current_text)
|
59
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|Track|Trackpoint|Position|LongitudeDegrees'
|
60
|
+
@current_trackpoint.set(name, get_current_text)
|
61
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|Track|Trackpoint|AltitudeMeters'
|
62
|
+
@current_trackpoint.set(name, get_current_text)
|
63
|
+
elsif path == 'TrainingCenterDatabase|Activities|Activity|Lap|Track|Trackpoint|DistanceMeters'
|
64
|
+
@current_trackpoint.set(name, get_current_text)
|
65
|
+
|
66
|
+
end
|
67
|
+
@current_text = ''
|
68
|
+
@tags.pop
|
69
|
+
end
|
70
|
+
|
71
|
+
def current_path
|
72
|
+
@tags.join('|')
|
73
|
+
end
|
74
|
+
|
75
|
+
def dump_activities
|
76
|
+
@activities.each { | activity | activity.dump }
|
77
|
+
end
|
78
|
+
|
79
|
+
def post_process
|
80
|
+
@activities.each { | activity | activity.post_process }
|
81
|
+
end
|
82
|
+
|
83
|
+
def trackpoints_to_csv
|
84
|
+
lines = []
|
85
|
+
@activities.each { | activity |
|
86
|
+
activity_csv_lines = activity.trackpoints_csv
|
87
|
+
activity_csv_lines.each { | line | lines << line }
|
88
|
+
}
|
89
|
+
lines
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Gooby = Google APIs + Ruby. Copyright 2009 by Chris Joakim.
|
4
|
+
Gooby is available under GNU General Public License (GPL) license.
|
5
|
+
|
6
|
+
=end
|
7
|
+
|
8
|
+
class GoobyGoogleKmlGenerator < GoobyBaseObject
|
9
|
+
|
10
|
+
include GoobyConfiguration
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@trackpoints = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate(config_file)
|
17
|
+
read_configuration(config_file)
|
18
|
+
read_csv_file
|
19
|
+
collect_placemarks
|
20
|
+
collect_coordinates
|
21
|
+
template = ERB.new(kml_document_template, 0, "<>")
|
22
|
+
result = template.result(binding)
|
23
|
+
kmz_build = @configuration['kmz_build']
|
24
|
+
kmz_build_command = @configuration['kmz_build_command']
|
25
|
+
if kmz_build && kmz_build_command
|
26
|
+
out_file = 'out/doc.kml'
|
27
|
+
out = File.new out_file, "w+"
|
28
|
+
out.write result
|
29
|
+
out.flush
|
30
|
+
out.close
|
31
|
+
puts "file created: #{out_file}"
|
32
|
+
puts "executing kmz build command: #{kmz_build_command}"
|
33
|
+
`#{kmz_build_command}`
|
34
|
+
puts "kmz build completed"
|
35
|
+
else
|
36
|
+
out_file = @configuration['kml_file'] ||= 'kml/gooby_google_earth_map.kml'
|
37
|
+
out = File.new out_file, "w+"
|
38
|
+
out.write result
|
39
|
+
out.flush
|
40
|
+
out.close
|
41
|
+
puts "file created: #{out_file}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def read_csv_file
|
46
|
+
csv_file = @configuration['csv_file']
|
47
|
+
first_point = @configuration['first_point'].to_i
|
48
|
+
last_point = @configuration['last_point'].to_i
|
49
|
+
puts "reading csv_file #{csv_file} first_point: #{first_point} last_point: #{last_point}"
|
50
|
+
row_number = 0
|
51
|
+
FasterCSV.foreach(csv_file) do | row |
|
52
|
+
row_number = row_number + 1
|
53
|
+
tkpt = GoobyTrackpoint.new
|
54
|
+
tkpt.from_csv(row)
|
55
|
+
if (row_number >= first_point) && (row_number <= last_point)
|
56
|
+
@trackpoints << tkpt
|
57
|
+
end
|
58
|
+
end
|
59
|
+
puts "csv_file #{csv_file} has been read; #{@trackpoints.size} trackpoints included"
|
60
|
+
end
|
61
|
+
|
62
|
+
def collect_placemarks
|
63
|
+
generate_mile_markers = @configuration['mile_markers']
|
64
|
+
@placemarks, next_checkpoint_f, next_checkpoint_i = [], 0.0, 0
|
65
|
+
first_tkpt, last_index = nil, @trackpoints.size - 1
|
66
|
+
@trackpoints.each_with_index { | tkpt, index |
|
67
|
+
if index == 0
|
68
|
+
first_tkpt = tkpt
|
69
|
+
end
|
70
|
+
if (tkpt.distance >= next_checkpoint_f) || (index == 0) || (index == last_index)
|
71
|
+
if next_checkpoint_i == 0
|
72
|
+
tkpt.set('PlacemarkName', 'Start')
|
73
|
+
tkpt.set('PlacemarkIcon', 'images/dd-start.png')
|
74
|
+
elsif index == last_index
|
75
|
+
tkpt.set('PlacemarkName', 'Finish')
|
76
|
+
tkpt.set('PlacemarkIcon', 'images/dd-end.png')
|
77
|
+
next_checkpoint_i = 999999
|
78
|
+
else
|
79
|
+
if generate_mile_markers
|
80
|
+
tkpt.set('PlacemarkName', '')
|
81
|
+
tkpt.set('PlacemarkIcon', "images/marker#{next_checkpoint_i.to_s}.png")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
tkpt.set('PlacemarkDescription', tkpt.as_info_window_html(next_checkpoint_i, first_tkpt.dttm))
|
85
|
+
tkpt.set('PlacemarkCoordinates', "#{tkpt.longitude},#{tkpt.latitude},1")
|
86
|
+
@placemarks << tkpt
|
87
|
+
next_checkpoint_i = next_checkpoint_i + 1
|
88
|
+
next_checkpoint_f = next_checkpoint_f + 1.0
|
89
|
+
end
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
def collect_coordinates
|
94
|
+
tkpt_count = @trackpoints.size.to_f
|
95
|
+
last_idx = tkpt_count - 1
|
96
|
+
next_idx = 0
|
97
|
+
app_max = @configuration['approx_max_points'].to_f
|
98
|
+
ratio = tkpt_count / app_max
|
99
|
+
if ratio > 1.0
|
100
|
+
increment = (tkpt_count / app_max).to_i
|
101
|
+
else
|
102
|
+
increment = 1
|
103
|
+
end
|
104
|
+
@coordinates = ''
|
105
|
+
@trackpoints.each_with_index { | tkpt, idx |
|
106
|
+
if (idx == 0) || (idx == last_idx) || (idx == next_idx)
|
107
|
+
@coordinates << " #{tkpt.longitude},#{tkpt.latitude},1\n"
|
108
|
+
next_idx = idx + increment
|
109
|
+
end
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def kml_document_template
|
114
|
+
template = <<HEREDOC
|
115
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
116
|
+
<kml xmlns="http://www.opengis.net/kml/2.2">
|
117
|
+
<Document>
|
118
|
+
<!-- kml file generated by Gooby version 2.0.0 -->
|
119
|
+
<name><%= @configuration['map_title'] %></name>
|
120
|
+
<Style id="goobyStyle">
|
121
|
+
<BalloonStyle>
|
122
|
+
<text>$[description]</text>
|
123
|
+
</BalloonStyle>
|
124
|
+
<LineStyle>
|
125
|
+
<color>7f0000ff</color>
|
126
|
+
<width>4</width>
|
127
|
+
</LineStyle>
|
128
|
+
<PolyStyle>
|
129
|
+
<color>7f0000ff</color>
|
130
|
+
</PolyStyle>
|
131
|
+
</Style>
|
132
|
+
<% @placemarks.each do | tkpt | %>
|
133
|
+
<Placemark>
|
134
|
+
<name><%= tkpt.get('PlacemarkName') %></name>
|
135
|
+
<description><%= tkpt.get('PlacemarkDescription') %></description>
|
136
|
+
<Style>
|
137
|
+
<IconStyle>
|
138
|
+
<Icon>
|
139
|
+
<href><%= tkpt.get('PlacemarkIcon') %></href>
|
140
|
+
</Icon>
|
141
|
+
</IconStyle>
|
142
|
+
</Style>
|
143
|
+
<styleUrl>#goobyStyle</styleUrl>
|
144
|
+
<Point>
|
145
|
+
<coordinates><%= tkpt.get('PlacemarkCoordinates') %></coordinates>
|
146
|
+
</Point>
|
147
|
+
</Placemark>
|
148
|
+
<% end %>
|
149
|
+
<Placemark>
|
150
|
+
<name>Route</name>
|
151
|
+
<visibility>1</visibility>
|
152
|
+
<description>Route</description>
|
153
|
+
<styleUrl>#goobyStyle</styleUrl>
|
154
|
+
<LineString>
|
155
|
+
<tessellate>1</tessellate>
|
156
|
+
<altitudeMode>relativeToGround</altitudeMode>
|
157
|
+
<coordinates>
|
158
|
+
<%= @coordinates %>
|
159
|
+
</coordinates>
|
160
|
+
</LineString>
|
161
|
+
</Placemark>
|
162
|
+
</Document>
|
163
|
+
</kml>
|
164
|
+
HEREDOC
|
165
|
+
template
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
@@ -1,385 +1,320 @@
|
|
1
1
|
=begin
|
2
2
|
|
3
|
-
Gooby = Google APIs + Ruby
|
4
|
-
Gooby - Copyright 2007 by Chris Joakim.
|
3
|
+
Gooby = Google APIs + Ruby. Copyright 2009 by Chris Joakim.
|
5
4
|
Gooby is available under GNU General Public License (GPL) license.
|
6
5
|
|
7
6
|
=end
|
8
7
|
|
9
|
-
|
8
|
+
class GoobyGoogleMapGenerator < GoobyBaseObject
|
10
9
|
|
11
|
-
|
12
|
-
Instances of this class represent a <Run> aggregate object from a
|
13
|
-
Forerunner XML file.
|
14
|
-
|
15
|
-
Additionally, there is distance, pace, and Google Map generation logic
|
16
|
-
in this class.
|
17
|
-
=end
|
10
|
+
include GoobyConfiguration
|
18
11
|
|
19
|
-
|
12
|
+
attr_reader :csv_file, :csv_lines, :dttm_idx, :num_idx, :lat_idx, :lng_idx, :alt_idx, :cdist_idx
|
13
|
+
attr_reader :run, :tkpts, :content_hash, :center_longitude, :center_latitude, :gpoint_array, :overlay_points, :notes
|
14
|
+
attr_reader :center_longitude, :center_latitude
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
@configuration = Gooby::Configuration.get_config
|
40
|
-
@dttm_idx = @configuration.get('csv_dttm_idx') if @configuration.get('csv_dttm_idx')
|
41
|
-
@num_idx = @configuration.get('csv_num_idx') if @configuration.get('csv_num_idx')
|
42
|
-
@lat_idx = @configuration.get('csv_lat_idx') if @configuration.get('csv_lat_idx')
|
43
|
-
@lng_idx = @configuration.get('csv_lng_idx') if @configuration.get('csv_lng_idx')
|
44
|
-
@alt_idx = @configuration.get('csv_alt_idx') if @configuration.get('csv_alt_idx')
|
45
|
-
@title = @configuration.get("#{@csv_file}")
|
46
|
-
|
47
|
-
@content_hash = Hash.new('')
|
48
|
-
@run = Gooby::Run.new(1)
|
49
|
-
@track = Gooby::Track.new(1)
|
50
|
-
@run.add_track(@track)
|
51
|
-
@tkpts = Array.new
|
52
|
-
@icon_url_base = @configuration.get('gmap_icon_url_base')
|
53
|
-
|
54
|
-
list = Array.new
|
55
|
-
list << @csv_file
|
56
|
-
@csv_reader = Gooby::CsvReader.new(list)
|
57
|
-
@csv_points = @csv_reader.read
|
58
|
-
@csv_points.each { |csv_point|
|
59
|
-
tkpt = csv_point.as_trackpoint
|
60
|
-
if tkpt
|
61
|
-
@track.add_trackpoint(tkpt)
|
62
|
-
end
|
63
|
-
}
|
64
|
-
@run.finish
|
65
|
-
end
|
66
|
-
|
67
|
-
=begin
|
68
|
-
Returns a Hash with specific generated content at the following keys:
|
69
|
-
=end
|
70
|
-
def generate(configuration)
|
71
|
-
if (configuration == nil)
|
72
|
-
@configuration = Gooby::Configuration.get_config
|
73
|
-
else
|
74
|
-
@configuration = configuration
|
75
|
-
end
|
76
|
-
@content_hash['when_generated'] = Time.now
|
77
|
-
@content_hash['title'] = @title
|
78
|
-
@icon_url_base = @configuration.get('gmap_icon_url_base')
|
79
|
-
filter_trackpoints
|
80
|
-
compute_center_point
|
81
|
-
generate_key_js
|
82
|
-
generate_map_div
|
83
|
-
generate_messages_div
|
84
|
-
generate_main_js_start
|
85
|
-
generate_main_js_route_overlay
|
86
|
-
generate_main_js_checkpoint_overlays
|
87
|
-
generate_main_js_map_clicked_listeners
|
88
|
-
generate_main_js_end
|
89
|
-
@content_hash
|
90
|
-
end
|
91
|
-
|
92
|
-
def filter_trackpoints
|
93
|
-
count, @tkpts = 0, Array.new
|
94
|
-
firstTkpt = @configuration.get('gmap_first_tkpt_number')
|
95
|
-
lastTkpt = @configuration.get('gmap_last_tkpt_number')
|
96
|
-
@run.tracks.each { |trk|
|
97
|
-
trk.trackpoints.each { |tkpt|
|
98
|
-
count = count + 1
|
99
|
-
if ((count >= firstTkpt) && (count <= lastTkpt))
|
100
|
-
@tkpts.push(tkpt)
|
101
|
-
end
|
102
|
-
}
|
103
|
-
}
|
104
|
-
end
|
105
|
-
|
106
|
-
=begin
|
107
|
-
Returns a Hash with specific generated content at the following keys:
|
108
|
-
=end
|
109
|
-
def generate_page(configuration)
|
110
|
-
|
111
|
-
# puts "generate_page #{@csv_file} #{@csv_lines.size}"
|
112
|
-
content_hash = generate(nil)
|
113
|
-
s = String.new(@csv_file)
|
114
|
-
s.gsub("/", " ")
|
115
|
-
tokens = tokenize(s, nil)
|
116
|
-
out_file = "#{tokens[-2]}.html"
|
117
|
-
#content_hash.keys.sort.each { | key | puts key }
|
16
|
+
def initialize
|
17
|
+
@content_hash, @trackpoints = Hash.new(''), []
|
18
|
+
end
|
19
|
+
|
20
|
+
# 2009_01_01_14_45_00_tcx.xml
|
21
|
+
|
22
|
+
def generate(config_file)
|
23
|
+
read_configuration(config_file)
|
24
|
+
read_csv_file
|
25
|
+
compute_center_point
|
26
|
+
generate_key_js
|
27
|
+
generate_map_div
|
28
|
+
generate_messages_div
|
29
|
+
generate_main_js_start
|
30
|
+
generate_main_js_route_overlay
|
31
|
+
generate_main_js_checkpoint_overlays
|
32
|
+
generate_main_js_map_clicked_listeners
|
33
|
+
generate_main_js_end
|
118
34
|
|
119
|
-
s = <<HERE
|
35
|
+
s = <<HERE
|
120
36
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
121
|
-
|
37
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
122
38
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
</body>
|
39
|
+
<head>
|
40
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
|
41
|
+
<meta name="description" content="Google Map generated by Gooby version 2.0.0">
|
42
|
+
<meta name="keywords" content="Google Map Generated by Gooby version 2.0.0">
|
43
|
+
<title> #{@configuration['map_title']} </title>
|
44
|
+
#{@content_hash['key_js']}
|
45
|
+
#{@content_hash['main_js_start']}
|
46
|
+
#{@content_hash['main_js_route_overlay']}
|
47
|
+
#{@content_hash['main_js_checkpoint_overlays']}
|
48
|
+
#{@content_hash['main_js_map_clicked_listeners']}
|
49
|
+
#{@content_hash['main_js_end']}
|
50
|
+
</head>
|
51
|
+
<body onload="load()" onunload="GUnload()">
|
52
|
+
<center>
|
53
|
+
<h3> #{@configuration['map_title']} </h3>
|
54
|
+
#{@content_hash['map_div']}
|
55
|
+
#{@content_hash['messages_div']}
|
56
|
+
</center>
|
57
|
+
</body>
|
143
58
|
</html>
|
144
59
|
HERE
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
@content_hash['center_longitude'] = @center_longitude
|
164
|
-
@content_hash['center_latitude'] = @center_latitude
|
165
|
-
end
|
166
|
-
|
167
|
-
def generate_key_js
|
168
|
-
key = @configuration.get('gmap_key')
|
169
|
-
key.strip!
|
170
|
-
# <script src="http://maps.google.com/maps?file=api&v=2&key=<%= @gmap_key -%>" type="text/javascript"></script>
|
171
|
-
s = "<script src='http://maps.google.com/maps?file=api&v=2&key="
|
172
|
-
s << key
|
173
|
-
s << "' type='text/javascript'></script>"
|
174
|
-
@content_hash['key_js'] = s
|
175
|
-
end
|
176
|
-
|
177
|
-
def generate_map_div
|
178
|
-
width = @configuration.get('gmap_width')
|
179
|
-
height = @configuration.get('gmap_height')
|
180
|
-
id = @configuration.get('gmap_map_element_id')
|
181
|
-
s = '<div id="'
|
182
|
-
s << id
|
183
|
-
s << '" style="width: '
|
184
|
-
s << width
|
185
|
-
s << '; height: '
|
186
|
-
s << height
|
187
|
-
s << '"></div>'
|
188
|
-
@content_hash['map_width'] = width
|
189
|
-
@content_hash['map_height'] = height
|
190
|
-
@content_hash['map_div'] = s
|
60
|
+
out_file = @configuration['html_file'] ||= 'html/gooby_google_map.html'
|
61
|
+
write_file(out_file, s)
|
62
|
+
puts "file created: #{out_file}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def read_csv_file
|
66
|
+
csv_file = @configuration['csv_file']
|
67
|
+
first_point = @configuration['first_point'].to_i
|
68
|
+
last_point = @configuration['last_point'].to_i
|
69
|
+
puts "reading csv_file #{csv_file} first_point: #{first_point} last_point: #{last_point}"
|
70
|
+
row_number = 0
|
71
|
+
FasterCSV.foreach(csv_file) do | row |
|
72
|
+
row_number = row_number + 1
|
73
|
+
tkpt = GoobyTrackpoint.new
|
74
|
+
tkpt.from_csv(row)
|
75
|
+
if (row_number >= first_point) && (row_number <= last_point)
|
76
|
+
@trackpoints << tkpt
|
77
|
+
end
|
191
78
|
end
|
79
|
+
puts "csv_file #{csv_file} has been read; #{@trackpoints.size} trackpoints included"
|
80
|
+
end
|
81
|
+
|
82
|
+
def compute_center_point
|
83
|
+
highLat, highLong, lowLat, lowLong = -999.0, -999.0, 999.0, 999.0
|
84
|
+
@trackpoints.each { | tkpt |
|
85
|
+
highLat = tkpt.latitude if tkpt.latitude > highLat
|
86
|
+
lowLat = tkpt.latitude if tkpt.latitude < lowLat
|
87
|
+
highLong = tkpt.longitude if tkpt.longitude > highLong
|
88
|
+
lowLong = tkpt.longitude if tkpt.longitude < lowLong
|
89
|
+
}
|
90
|
+
@center_longitude = (highLong + lowLong) / 2
|
91
|
+
@center_latitude = (highLat + lowLat) / 2
|
92
|
+
@content_hash['center_longitude'] = @center_longitude
|
93
|
+
@content_hash['center_latitude'] = @center_latitude
|
94
|
+
end
|
95
|
+
|
96
|
+
def generate_key_js
|
97
|
+
key = @configuration['gmap_key']
|
98
|
+
key.strip!
|
99
|
+
s = "<script src='http://maps.google.com/maps?file=api&v=2&key="
|
100
|
+
s << key
|
101
|
+
s << "' type='text/javascript'></script>"
|
102
|
+
@content_hash['key_js'] = s
|
103
|
+
end
|
104
|
+
|
105
|
+
def generate_map_div
|
106
|
+
width = @configuration['gmap_width']
|
107
|
+
height = @configuration['gmap_height']
|
108
|
+
id = @configuration['map_element_id']
|
109
|
+
s = '<div id="'
|
110
|
+
s << id
|
111
|
+
s << '" style="width: '
|
112
|
+
s << width
|
113
|
+
s << '; height: '
|
114
|
+
s << height
|
115
|
+
s << '"></div>'
|
116
|
+
@content_hash['map_width'] = width
|
117
|
+
@content_hash['map_height'] = height
|
118
|
+
@content_hash['map_div'] = s
|
119
|
+
end
|
192
120
|
|
193
|
-
|
194
|
-
|
195
|
-
|
121
|
+
def generate_messages_div
|
122
|
+
s = "<div id=\"messages\"></div>"
|
123
|
+
@content_hash['messages_div'] = s
|
124
|
+
end
|
125
|
+
|
126
|
+
def generate_main_js_start
|
127
|
+
id = @configuration['map_element_id']
|
128
|
+
size = @configuration['gmap_size_control']
|
129
|
+
type = @configuration['gmap_type']
|
130
|
+
zoom = @configuration['gmap_zoom_level']
|
131
|
+
title = @configuration["#{@csv_file}"]
|
132
|
+
title = '' if title == nil
|
133
|
+
zoom_tab = @configuration['gmap_zoom_tab']
|
134
|
+
if size
|
135
|
+
if size == 'smallmap'
|
136
|
+
size = 'GSmallMapControl'
|
137
|
+
elsif size == 'smallzoom'
|
138
|
+
size = 'GSmallMapControl'
|
139
|
+
else
|
140
|
+
size = 'GLargeMapControl'
|
141
|
+
end
|
196
142
|
end
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
type
|
202
|
-
|
203
|
-
title = @configuration.get("#{@csv_file}")
|
204
|
-
title = '' if title == nil
|
205
|
-
zoom_tab = @configuration.get('gmap_zoom_tab')
|
206
|
-
if size
|
207
|
-
if size == 'smallmap'
|
208
|
-
size = 'GSmallMapControl'
|
209
|
-
elsif size == 'smallzoom'
|
210
|
-
size = 'GSmallMapControl'
|
211
|
-
else
|
212
|
-
size = 'GLargeMapControl'
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
if type
|
217
|
-
if type == 'satellite'
|
218
|
-
type = 'G_SATELLITE_MAP'
|
219
|
-
elsif type == 'hybrid'
|
220
|
-
type = 'G_HYBRID_MAP'
|
221
|
-
else
|
222
|
-
type = 'G_NORMAL_MAP'
|
223
|
-
end
|
143
|
+
|
144
|
+
if type
|
145
|
+
if type == 'satellite'
|
146
|
+
type = 'G_SATELLITE_MAP'
|
147
|
+
elsif type == 'hybrid'
|
148
|
+
type = 'G_HYBRID_MAP'
|
224
149
|
else
|
225
150
|
type = 'G_NORMAL_MAP'
|
226
151
|
end
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
152
|
+
else
|
153
|
+
type = 'G_NORMAL_MAP'
|
154
|
+
end
|
155
|
+
s = '<script type="text/javascript">'
|
156
|
+
s << "\n"
|
157
|
+
s << "//<![CDATA[ \n"
|
158
|
+
s << " function load() { \n"
|
159
|
+
s << " if (GBrowserIsCompatible()) { \n"
|
160
|
+
s << ' var map = new GMap2(document.getElementById("'
|
161
|
+
s << id
|
162
|
+
s << '")); '
|
163
|
+
s << "\n"
|
164
|
+
|
165
|
+
if size
|
166
|
+
s << ' map.addControl(new '
|
167
|
+
s << size
|
168
|
+
s << '());'
|
236
169
|
s << "\n"
|
170
|
+
end
|
237
171
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
if type
|
246
|
-
s << ' map.addControl(new GMapTypeControl());'
|
247
|
-
s << "\n"
|
248
|
-
# s << ' map.setMapType('
|
249
|
-
# s << type
|
250
|
-
# s << ');'
|
251
|
-
s << "\n"
|
252
|
-
end
|
253
|
-
s << " var centerPoint = new GLatLng(#{@center_latitude}, #{@center_longitude}); // #{project_embedded_comment} \n"
|
254
|
-
s << " map.setCenter(centerPoint, #{zoom}); \n"
|
172
|
+
if type
|
173
|
+
s << ' map.addControl(new GMapTypeControl());'
|
174
|
+
s << "\n"
|
175
|
+
# s << ' map.setMapType('
|
176
|
+
# s << type
|
177
|
+
# s << ');'
|
255
178
|
s << "\n"
|
256
|
-
|
257
|
-
|
179
|
+
end
|
180
|
+
s << " var centerPoint = new GLatLng(#{@center_latitude}, #{@center_longitude}); // #{project_embedded_comment} \n"
|
181
|
+
s << " map.setCenter(centerPoint, #{zoom}); \n"
|
182
|
+
@content_hash['main_js_start'] = s
|
183
|
+
end
|
184
|
+
|
185
|
+
def project_embedded_comment
|
186
|
+
"Map generated by Gooby"
|
187
|
+
end
|
188
|
+
|
189
|
+
def generate_main_js_route_overlay
|
190
|
+
tkpt_count = @trackpoints.size.to_f
|
191
|
+
app_max = @configuration['approx_max_points'].to_f
|
192
|
+
gen_comments = @configuration['gen_comments']
|
193
|
+
ratio = tkpt_count / app_max
|
194
|
+
@start_dttm = nil
|
195
|
+
if ratio > 1.0
|
196
|
+
increment = (tkpt_count / app_max).to_i
|
197
|
+
else
|
198
|
+
increment = 1
|
258
199
|
end
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
if
|
267
|
-
|
200
|
+
curr_idx, next_idx, gpoint_count, last_idx = -1, 0, 0, @trackpoints.size - 1
|
201
|
+
s = " var points = new Array(); "
|
202
|
+
@trackpoints.each { |tkpt|
|
203
|
+
curr_idx = curr_idx + 1
|
204
|
+
if curr_idx == 0
|
205
|
+
@start_dttm, @start_pos = tkpt.dttm, tkpt
|
206
|
+
end
|
207
|
+
if ((curr_idx == next_idx) || (curr_idx == last_idx) || (tkpt.split?))
|
208
|
+
gpoint_count = gpoint_count + 1
|
209
|
+
s << tkpt.as_glatlng(false, gen_comments, tkpt_count, curr_idx, @start_dttm)
|
210
|
+
next_idx = curr_idx + increment
|
268
211
|
else
|
269
|
-
|
212
|
+
s << tkpt.as_glatlng(true, gen_comments, tkpt_count, curr_idx, @start_dttm)
|
270
213
|
end
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
214
|
+
}
|
215
|
+
s << "\n"
|
216
|
+
s << "\n // app_max=#{app_max} ratio=#{ratio} increment=#{increment}"
|
217
|
+
s << "\n"
|
218
|
+
s << "\n var routePolyline = new GPolyline(points); "
|
219
|
+
s << "\n map.addOverlay(routePolyline); "
|
220
|
+
@content_hash['main_js_route_overlay'] = s
|
221
|
+
@content_hash['main_js_route_overlay_increment'] = increment
|
222
|
+
end
|
223
|
+
|
224
|
+
def generate_main_js_checkpoint_overlays
|
225
|
+
generate_mile_markers = @configuration['mile_markers']
|
226
|
+
s = "\n // Create a base icon for all of our markers that specifies the "
|
227
|
+
s << "\n // shadow, icon dimensions, etc."
|
228
|
+
s << "\n var baseIcon = new GIcon();"
|
229
|
+
s << "\n baseIcon.shadow = \"#{icon_url_base}shadow50.png\";"
|
230
|
+
s << "\n baseIcon.iconSize = new GSize(20, 34);"
|
231
|
+
s << "\n baseIcon.shadowSize = new GSize(37, 34);"
|
232
|
+
s << "\n baseIcon.iconAnchor = new GPoint(9, 34);"
|
233
|
+
s << "\n baseIcon.infoWindowAnchor = new GPoint(9, 2);"
|
234
|
+
s << "\n baseIcon.infoShadowAnchor = new GPoint(18, 25);"
|
235
|
+
s << "\n"
|
236
|
+
curr_idx = -1
|
237
|
+
last_idx = @trackpoints.size - 1
|
238
|
+
next_checkpoint = 0.0
|
239
|
+
@start_dttm = nil
|
240
|
+
@trackpoints.each { | tkpt |
|
241
|
+
curr_idx = curr_idx + 1
|
242
|
+
if curr_idx == 0
|
243
|
+
@start_dttm = tkpt.dttm
|
244
|
+
if @trackpoints.size == 1
|
245
|
+
label = @configuration['gmap_1_point_map_info_window_label']
|
246
|
+
info_window_html = tkpt.as_one_point_info_window_html(label)
|
285
247
|
else
|
286
|
-
|
248
|
+
info_window_html = tkpt.as_quoted_info_window_html(0, @start_dttm)
|
287
249
|
end
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
@start_dttm = tkpt.dttm
|
316
|
-
info_window_html = tkpt.as_info_window_html('Start', @start_dttm)
|
317
|
-
s << "\n var iconStart = new GIcon(baseIcon); "
|
318
|
-
s << "\n iconStart.image = \"#{@icon_url_base}dd-start.png\";"
|
319
|
-
s << "\n var pStart = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
|
320
|
-
s << "\n var mStart = new GMarker(pStart, iconStart);"
|
321
|
-
s << "\n GEvent.addListener(mStart, \"click\", function() { "
|
322
|
-
s << "\n mStart.openInfoWindowHtml(#{info_window_html});"
|
323
|
-
s << "\n }); "
|
324
|
-
s << "\n map.addOverlay(mStart);"
|
325
|
-
s << "\n "
|
326
|
-
next_checkpoint = 1.0
|
327
|
-
elsif curr_idx == last_idx
|
328
|
-
info_window_html = tkpt.as_info_window_html('Finish', @start_dttm)
|
329
|
-
s << "\n var iconFinish = new GIcon(baseIcon); "
|
330
|
-
s << "\n iconFinish.image = \"#{@icon_url_base}dd-end.png\";"
|
331
|
-
s << "\n var pFinish = new GPoint(#{tkpt.longitude_as_float}, #{tkpt.latitude_as_float});"
|
332
|
-
s << "\n var mFinish = new GMarker(pFinish, iconFinish);"
|
333
|
-
s << "\n GEvent.addListener(mFinish, \"click\", function() { "
|
334
|
-
s << "\n mFinish.openInfoWindowHtml(#{info_window_html});"
|
335
|
-
s << "\n }); "
|
336
|
-
s << "\n map.addOverlay(mFinish);"
|
337
|
-
s << "\n "
|
338
|
-
next_checkpoint = 999999
|
339
|
-
else
|
340
|
-
if (tkpt.cumulative_distance >= next_checkpoint)
|
341
|
-
integer = next_checkpoint.to_i
|
342
|
-
info_window_html = tkpt.as_info_window_html("#{integer}", @start_dttm)
|
250
|
+
s << "\n var iconStart = new GIcon(baseIcon); "
|
251
|
+
s << "\n iconStart.image = \"#{icon_url_base}dd-start.png\";"
|
252
|
+
s << "\n var pStart = new GPoint(#{tkpt.longitude}, #{tkpt.latitude});"
|
253
|
+
s << "\n var mStart = new GMarker(pStart, iconStart);"
|
254
|
+
s << "\n GEvent.addListener(mStart, \"click\", function() { "
|
255
|
+
s << "\n mStart.openInfoWindowHtml(#{info_window_html});"
|
256
|
+
s << "\n }); "
|
257
|
+
s << "\n map.addOverlay(mStart);"
|
258
|
+
s << "\n "
|
259
|
+
next_checkpoint = 1.0
|
260
|
+
elsif curr_idx == last_idx
|
261
|
+
info_window_html = tkpt.as_quoted_info_window_html(999999, @start_dttm)
|
262
|
+
s << "\n var iconFinish = new GIcon(baseIcon); "
|
263
|
+
s << "\n iconFinish.image = \"#{icon_url_base}dd-end.png\";"
|
264
|
+
s << "\n var pFinish = new GPoint(#{tkpt.longitude}, #{tkpt.latitude});"
|
265
|
+
s << "\n var mFinish = new GMarker(pFinish, iconFinish);"
|
266
|
+
s << "\n GEvent.addListener(mFinish, \"click\", function() { "
|
267
|
+
s << "\n mFinish.openInfoWindowHtml(#{info_window_html});"
|
268
|
+
s << "\n }); "
|
269
|
+
s << "\n map.addOverlay(mFinish);"
|
270
|
+
s << "\n "
|
271
|
+
next_checkpoint = 999999
|
272
|
+
else
|
273
|
+
if (tkpt.distance >= next_checkpoint)
|
274
|
+
integer = next_checkpoint.to_i
|
275
|
+
if generate_mile_markers
|
276
|
+
info_window_html = tkpt.as_quoted_info_window_html("#{integer}", @start_dttm)
|
343
277
|
s << "\n var icon#{integer} = new GIcon(baseIcon); "
|
344
|
-
s << "\n icon#{integer}.image = \"#{
|
345
|
-
s << "\n var p#{integer} = new GPoint(#{tkpt.
|
278
|
+
s << "\n icon#{integer}.image = \"#{icon_url_base}marker#{integer}.png\";"
|
279
|
+
s << "\n var p#{integer} = new GPoint(#{tkpt.longitude}, #{tkpt.latitude});"
|
346
280
|
s << "\n var m#{integer} = new GMarker(p#{integer}, icon#{integer});"
|
347
281
|
s << "\n GEvent.addListener(m#{integer}, \"click\", function() { "
|
348
|
-
s << "\n
|
282
|
+
s << "\n m#{integer}.openInfoWindowHtml(#{info_window_html});"
|
349
283
|
s << "\n }); "
|
350
284
|
s << "\n map.addOverlay(m#{integer});"
|
351
285
|
s << "\n "
|
352
|
-
|
353
|
-
|
354
|
-
end
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
286
|
+
end
|
287
|
+
next_checkpoint = next_checkpoint + 1.0
|
288
|
+
end
|
289
|
+
end
|
290
|
+
}
|
291
|
+
s << "\n"
|
292
|
+
@content_hash['main_js_checkpoint_overlays'] = s
|
293
|
+
end
|
294
|
+
|
295
|
+
def generate_main_js_map_clicked_listeners
|
296
|
+
s = "\n"
|
297
|
+
s << "\n GEvent.addListener(map, \"click\", function() { "
|
298
|
+
s << "\n var center = map.getCenter(); \n"
|
299
|
+
s << "\n document.getElementById(\"messages\").innerHTML = 'click: ' + center.toString(); "
|
300
|
+
s << "\n });"
|
301
|
+
s << "\n GEvent.addListener(map, \"moveend\", function() { "
|
302
|
+
s << "\n var center = map.getCenter(); \n"
|
303
|
+
s << "\n document.getElementById(\"messages\").innerHTML = 'moveend: ' + center.toString(); "
|
304
|
+
s << "\n });"
|
305
|
+
@content_hash['main_js_map_clicked_listeners'] = s
|
306
|
+
end
|
307
|
+
|
308
|
+
def generate_main_js_end
|
309
|
+
s = "\n } "
|
310
|
+
s << "\n } "
|
311
|
+
s << "\n//]]> \n"
|
312
|
+
s << "\n</script>"
|
313
|
+
@content_hash['main_js_end'] = s
|
314
|
+
end
|
315
|
+
|
316
|
+
def icon_url_base
|
317
|
+
@configuration['gmap_icon_url_base']
|
383
318
|
end
|
384
319
|
|
385
|
-
end
|
320
|
+
end
|