google_map 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/MIT_LICENSE.txt +22 -0
- data/README +180 -0
- data/Rakefile +25 -0
- data/google_map.gemspec +21 -0
- data/lib/google_map/bounding_box.rb +6 -0
- data/lib/google_map/clusterer.rb +6 -0
- data/lib/google_map/geo_xml.rb +22 -0
- data/lib/google_map/icon.rb +64 -0
- data/lib/google_map/letter_icon.rb +14 -0
- data/lib/google_map/map.rb +430 -0
- data/lib/google_map/marker.rb +77 -0
- data/lib/google_map/marker_group.rb +6 -0
- data/lib/google_map/point.rb +22 -0
- data/lib/google_map/polyline.rb +43 -0
- data/lib/google_map/small_icon.rb +23 -0
- data/lib/google_map/version.rb +3 -0
- data/lib/google_map.rb +13 -0
- data/lib/unbacked_dom_id.rb +22 -0
- data/test/google_map_test.rb +65 -0
- data/test/test_helper.rb +52 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT_LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2011
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
======================================================
|
2
|
+
GoogleMap
|
3
|
+
======================================================
|
4
|
+
A RubyGem that and makes generating google maps easy as pie.
|
5
|
+
|
6
|
+
|
7
|
+
======================================================
|
8
|
+
INSTALL
|
9
|
+
======================================================
|
10
|
+
gem install google_map
|
11
|
+
|
12
|
+
|
13
|
+
======================================================
|
14
|
+
PLUGIN CONFIGURATION
|
15
|
+
======================================================
|
16
|
+
1 - Set your Google Maps API Key in environment.rb (or somewhere else if you'd prefer)
|
17
|
+
I'd suggest copying the configuration code out of your environment.rb and into an initializer named geokit
|
18
|
+
|
19
|
+
# This key is good for localhost:3000, signup for more at http://www.google.com/apis/maps/signup.html
|
20
|
+
GOOGLE_APPLICATION_ID = "ABQIAAAA3HdfrnxFAPWyY-aiJUxmqRTJQa0g3IQ9GZqIMmInSLzwtGDKaBQ0KYLwBEKSM7F9gCevcsIf6WPuIQ"
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
======================================================
|
25
|
+
MAP CONTROLS
|
26
|
+
======================================================
|
27
|
+
|
28
|
+
maps_controller.rb
|
29
|
+
--------------------------
|
30
|
+
class MapsController < ApplicationController
|
31
|
+
def show
|
32
|
+
@map = GoogleMap::Map.new
|
33
|
+
|
34
|
+
# define control types shown on map
|
35
|
+
@map.controls = [ :large, :scale, :type ]
|
36
|
+
# valid controls options include
|
37
|
+
# :large
|
38
|
+
# :small
|
39
|
+
# :overview
|
40
|
+
# :large_3d
|
41
|
+
# :scale
|
42
|
+
# :type
|
43
|
+
# :menu_type
|
44
|
+
# :hierachical_type
|
45
|
+
# :zoom
|
46
|
+
# :zoom_3d
|
47
|
+
# :nav_label
|
48
|
+
|
49
|
+
# allow user to double click to zoom
|
50
|
+
@map.double_click_zoom = true
|
51
|
+
|
52
|
+
# not certain what this does
|
53
|
+
@map.continuous_zoom = false
|
54
|
+
|
55
|
+
# allow user to scroll using mouse wheel?
|
56
|
+
@map.scroll_wheel_zoom = false
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
======================================================
|
62
|
+
MAP CENTERING AND ZOOM
|
63
|
+
======================================================
|
64
|
+
|
65
|
+
maps_controller.rb
|
66
|
+
--------------------------
|
67
|
+
class MapsController < ApplicationController
|
68
|
+
def show
|
69
|
+
@map = GoogleMap::Map.new
|
70
|
+
@map.center = GoogleMap::Point.new(47.6597, -122.318) #SEATTLE WASHINGTON
|
71
|
+
@map.zoom = 10 #200km
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
======================================================
|
77
|
+
MAP CENTERING USING BOUNDS
|
78
|
+
======================================================
|
79
|
+
|
80
|
+
maps_controller.rb
|
81
|
+
--------------------------
|
82
|
+
class MapsController < ApplicationController
|
83
|
+
def show
|
84
|
+
@map = GoogleMap::Map.new
|
85
|
+
@map.bounds = [GoogleMap::Point.new(47.6597, -121.318), GoogleMap::Point.new(48.6597, -123.318)] #SEATTLE WASHINGTON 50KM
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
======================================================
|
92
|
+
SIMPLE MARKER USAGE
|
93
|
+
======================================================
|
94
|
+
|
95
|
+
maps_controller.rb
|
96
|
+
--------------------------
|
97
|
+
class MapsController < ApplicationController
|
98
|
+
def show
|
99
|
+
@map = GoogleMap::Map.new
|
100
|
+
@map.markers << GoogleMap::Marker.new( :map => @map,
|
101
|
+
:lat => 47.6597,
|
102
|
+
:lng => -122.318,
|
103
|
+
:html => 'My House')
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
maps/show.html.erb
|
108
|
+
-------------------------
|
109
|
+
<%= @map.to_html %>
|
110
|
+
<div style="width: 500px; height: 500px;">
|
111
|
+
<%= @map.div %>
|
112
|
+
</div>
|
113
|
+
|
114
|
+
|
115
|
+
======================================================
|
116
|
+
Advanced Marker Usage
|
117
|
+
======================================================
|
118
|
+
|
119
|
+
# Available icon classes:
|
120
|
+
# GoogleMap::LetterIcon.new(@map, 'A') # letter must be uppercase
|
121
|
+
# GoogleMap::SmallIcon.new(@map, 'yellow')
|
122
|
+
|
123
|
+
maps_controller.rb
|
124
|
+
--------------------------
|
125
|
+
class MapsController < ApplicationController
|
126
|
+
def show
|
127
|
+
@map = GoogleMap::Map.new
|
128
|
+
@map.markers << GoogleMap::Marker.new( :map => @map,
|
129
|
+
:icon => GoogleMap::SmallIcon.new(@map, 'blue'),
|
130
|
+
:lat => 47.6597,
|
131
|
+
:lng => -122.318,
|
132
|
+
:html => 'My House',
|
133
|
+
:marker_icon_path => '/path/to/image',
|
134
|
+
:marker_hover_text => 'String to show on Mouse Over',
|
135
|
+
:open_infoWindow => true #opens marker by default
|
136
|
+
)
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
maps/show.html.erb
|
142
|
+
-------------------------
|
143
|
+
<%= @map.to_html %>
|
144
|
+
<div style="width: 500px; height: 500px;">
|
145
|
+
<%= @map.div %>
|
146
|
+
</div>
|
147
|
+
|
148
|
+
|
149
|
+
======================================================
|
150
|
+
PLOTTING POLYLINE ROUTES
|
151
|
+
======================================================
|
152
|
+
|
153
|
+
maps_controller.rb
|
154
|
+
--------------------------
|
155
|
+
class MapsController < ApplicationController
|
156
|
+
def show
|
157
|
+
@map = GoogleMap::Map.new
|
158
|
+
|
159
|
+
# plot points for polyline
|
160
|
+
vertices = []
|
161
|
+
object.gpxroute.gpxtrackpoints.each do |p|
|
162
|
+
vertices << GoogleMap::Point.new(p.lat, p.lon)
|
163
|
+
end
|
164
|
+
|
165
|
+
# plot polyline
|
166
|
+
@map.overlays << GoogleMap::Polyline.new( :map => @map,
|
167
|
+
:color=>'#FF0000',
|
168
|
+
:weight=>'2',
|
169
|
+
:opacity=>'.5',
|
170
|
+
:vertices=>vertices
|
171
|
+
)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
maps/show.html.erb
|
176
|
+
-------------------------
|
177
|
+
<%= @map.to_html %>
|
178
|
+
<div style="width: 500px; height: 500px;">
|
179
|
+
<%= @map.div %>
|
180
|
+
</div>
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'rake/rdoctask'
|
7
|
+
|
8
|
+
desc 'Default: run unit tests.'
|
9
|
+
task :default => :test
|
10
|
+
|
11
|
+
desc 'Test the gmap_on_rails plugin.'
|
12
|
+
Rake::TestTask.new(:test) do |t|
|
13
|
+
t.libs << 'lib'
|
14
|
+
t.pattern = 'test/**/*_test.rb'
|
15
|
+
t.verbose = true
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Generate documentation for the gmap_on_rails plugin.'
|
19
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
20
|
+
rdoc.rdoc_dir = 'rdoc'
|
21
|
+
rdoc.title = 'GMaps on Rails'
|
22
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
23
|
+
rdoc.rdoc_files.include('README')
|
24
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
|
+
end
|
data/google_map.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "google_map/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "google_map"
|
7
|
+
s.version = GoogleMap::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Jeff Dutil"]
|
10
|
+
s.email = ["JDutil@BurlingtonWebApps.com"]
|
11
|
+
s.homepage = "https://github.com/jdutil/google_map"
|
12
|
+
s.summary = %q{Extends geokit and gives convenient helpers for adding google maps to your Rails applicaiton.}
|
13
|
+
s.description = %q{Extends geokit and gives convenient helpers for adding google maps to your Rails applicaiton.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "google_map"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class GeoXml
|
4
|
+
#include Reloadable
|
5
|
+
include UnbackedDomId
|
6
|
+
|
7
|
+
attr_accessor :url_of_xml
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
options.each_pair { |key, value| send("#{key}=", value) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_js
|
14
|
+
|
15
|
+
js = []
|
16
|
+
js << "#{dom_id} = new GGeoXml('#{url_of_xml}');"
|
17
|
+
|
18
|
+
js.join "\n"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class Icon
|
4
|
+
#include Reloadable
|
5
|
+
#include UnbackedDomId
|
6
|
+
|
7
|
+
attr_accessor :map,
|
8
|
+
:dom_id,
|
9
|
+
:width,
|
10
|
+
:height,
|
11
|
+
:shadow_width,
|
12
|
+
:shadow_height,
|
13
|
+
:image_url,
|
14
|
+
:shadow_url,
|
15
|
+
:anchor_x,
|
16
|
+
:anchor_y,
|
17
|
+
:info_anchor_x,
|
18
|
+
:info_anchor_y
|
19
|
+
|
20
|
+
def initialize(options = {})
|
21
|
+
self.image_url = 'http://www.google.com/mapfiles/marker.png'
|
22
|
+
self.shadow_url = 'http://www.google.com/mapfiles/shadow50.png'
|
23
|
+
self.width = 20
|
24
|
+
self.height = 34
|
25
|
+
self.shadow_width = 37
|
26
|
+
self.shadow_height = 34
|
27
|
+
self.anchor_x = 6
|
28
|
+
self.anchor_y = 20
|
29
|
+
self.info_anchor_x = 5
|
30
|
+
self.info_anchor_y = 1
|
31
|
+
options.each_pair { |key, value| send("#{key}=", value) }
|
32
|
+
|
33
|
+
if !map or !map.kind_of?(GoogleMap::Map)
|
34
|
+
raise "Must set map for GoogleMap::Icon."
|
35
|
+
end
|
36
|
+
if dom_id.blank?
|
37
|
+
self.dom_id = "#{map.dom_id}_icon_#{map.markers.size + 1}"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_js
|
43
|
+
js = []
|
44
|
+
js << "var #{dom_id} = new GIcon();"
|
45
|
+
js << "#{dom_id}.image = \"#{image_url}\";"
|
46
|
+
js << "#{dom_id}.shadow = \"#{shadow_url}\";"
|
47
|
+
js << "#{dom_id}.iconSize = new GSize(#{width}, #{height});"
|
48
|
+
js << "#{dom_id}.shadowSize = new GSize(#{shadow_width}, #{shadow_height});"
|
49
|
+
js << "#{dom_id}.iconAnchor = new GPoint(#{anchor_x}, #{anchor_y});"
|
50
|
+
js << "#{dom_id}.infoWindowAnchor = new GPoint(#{info_anchor_x}, #{info_anchor_y});"
|
51
|
+
return js.join("\n")
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_html
|
55
|
+
html = []
|
56
|
+
html << "<script type=\"text/javascript\">\n/* <![CDATA[ */\n"
|
57
|
+
html << to_js
|
58
|
+
html << "/* ]]> */</script> "
|
59
|
+
return html.join("\n")
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class LetterIcon < GoogleMap::Icon
|
4
|
+
#include Reloadable
|
5
|
+
|
6
|
+
alias_method :parent_initialize, :initialize
|
7
|
+
|
8
|
+
def initialize(map, letter)
|
9
|
+
parent_initialize(:map=>map, :image_url => "http://www.google.com/mapfiles/marker#{letter}.png")
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,430 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
class Map
|
3
|
+
#include Reloadable
|
4
|
+
include UnbackedDomId
|
5
|
+
attr_accessor :dom_id,
|
6
|
+
:markers,
|
7
|
+
:overlays,
|
8
|
+
:controls,
|
9
|
+
:inject_on_load,
|
10
|
+
:zoom,
|
11
|
+
:center,
|
12
|
+
:double_click_zoom,
|
13
|
+
:continuous_zoom,
|
14
|
+
:scroll_wheel_zoom,
|
15
|
+
:bounds,
|
16
|
+
:map_type
|
17
|
+
|
18
|
+
def initialize(options = {})
|
19
|
+
self.dom_id = 'google_map'
|
20
|
+
self.markers = []
|
21
|
+
self.overlays = []
|
22
|
+
self.bounds = []
|
23
|
+
self.controls = [ :large, :scale, :type ]
|
24
|
+
self.double_click_zoom = true
|
25
|
+
self.continuous_zoom = false
|
26
|
+
self.scroll_wheel_zoom = false
|
27
|
+
options.each_pair { |key, value| send("#{key}=", value) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_html
|
31
|
+
html = []
|
32
|
+
|
33
|
+
html << "<script src='http://maps.google.com/maps?file=api&v=2&key=#{GOOGLE_APPLICATION_ID}' type='text/javascript'></script>"
|
34
|
+
html << "<script type=\"text/javascript\">\n/* <![CDATA[ */\n"
|
35
|
+
html << to_js
|
36
|
+
html << "/* ]]> */</script> "
|
37
|
+
|
38
|
+
return html.join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_enable_prefix true_or_false
|
42
|
+
true_or_false ? "enable" : "disable"
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_js
|
46
|
+
js = []
|
47
|
+
|
48
|
+
# Initialise the map variable so that it can externally accessed.
|
49
|
+
js << "var #{dom_id};"
|
50
|
+
|
51
|
+
markers.each { |marker| js << "var #{marker.dom_id};" }
|
52
|
+
|
53
|
+
js << markers_functions_js
|
54
|
+
js << center_map_js
|
55
|
+
|
56
|
+
js << "function initialize_google_map_#{dom_id}() {"
|
57
|
+
js << " if(GBrowserIsCompatible()) {"
|
58
|
+
js << " #{dom_id} = new GMap2(document.getElementById('#{dom_id}'));"
|
59
|
+
|
60
|
+
js << " if (self['GoogleMapOnLoad']) {"
|
61
|
+
js << " #{dom_id}.load = GEvent.addListener(#{dom_id},'load',GoogleMapOnLoad)"
|
62
|
+
js << " }"
|
63
|
+
|
64
|
+
js << ' ' + map_type_js
|
65
|
+
js << ' ' + controls_js
|
66
|
+
js << ' ' + center_on_bounds_js
|
67
|
+
js << ' ' + markers_icons_js
|
68
|
+
|
69
|
+
# Put all the markers on the map.
|
70
|
+
for marker in markers
|
71
|
+
js << ' ' + marker.to_js
|
72
|
+
js << ''
|
73
|
+
end
|
74
|
+
|
75
|
+
overlays.each do |overlay|
|
76
|
+
js << overlay.to_js
|
77
|
+
js << "#{dom_id}.addOverlay(#{overlay.dom_id});"
|
78
|
+
end
|
79
|
+
|
80
|
+
js << "#{dom_id}.#{to_enable_prefix double_click_zoom}DoubleClickZoom();"
|
81
|
+
js << "#{dom_id}.#{to_enable_prefix continuous_zoom}ContinuousZoom();"
|
82
|
+
js << "#{dom_id}.#{to_enable_prefix scroll_wheel_zoom}ScrollWheelZoom();"
|
83
|
+
|
84
|
+
js << ' ' + inject_on_load.gsub("\n", " \n") if inject_on_load
|
85
|
+
js << " }"
|
86
|
+
js << "}"
|
87
|
+
|
88
|
+
# Load the map on window load preserving anything already on window.onload.
|
89
|
+
js << "if (typeof window.onload != 'function') {"
|
90
|
+
js << " window.onload = initialize_google_map_#{dom_id};"
|
91
|
+
js << "} else {"
|
92
|
+
js << " old_before_google_map_#{dom_id} = window.onload;"
|
93
|
+
js << " window.onload = function() {"
|
94
|
+
js << " old_before_google_map_#{dom_id}();"
|
95
|
+
js << " initialize_google_map_#{dom_id}();"
|
96
|
+
js << " }"
|
97
|
+
js << "}"
|
98
|
+
|
99
|
+
# Unload the map on window load preserving anything already on window.onunload.
|
100
|
+
#js << "if (typeof window.onunload != 'function') {"
|
101
|
+
#js << " window.onunload = GUnload();"
|
102
|
+
#js << "} else {"
|
103
|
+
#js << " old_before_onunload = window.onload;"
|
104
|
+
#js << " window.onunload = function() {"
|
105
|
+
#js << " old_before_onunload;"
|
106
|
+
#js << " GUnload();"
|
107
|
+
#js << " }"
|
108
|
+
#js << "}"
|
109
|
+
|
110
|
+
return js.join("\n")
|
111
|
+
end
|
112
|
+
|
113
|
+
def map_type_js
|
114
|
+
js = []
|
115
|
+
if map_type
|
116
|
+
js << "#{dom_id}.setMapType(#{map_type});"
|
117
|
+
end
|
118
|
+
js.join("\n")
|
119
|
+
end
|
120
|
+
|
121
|
+
def controls_js
|
122
|
+
js = []
|
123
|
+
|
124
|
+
controls.each do |control|
|
125
|
+
case control
|
126
|
+
when :large, :small, :overview
|
127
|
+
c = "G#{control.to_s.capitalize}MapControl"
|
128
|
+
when :large_3d
|
129
|
+
c = "GLargeMapControl3D"
|
130
|
+
when :scale
|
131
|
+
c = "GScaleControl"
|
132
|
+
when :type
|
133
|
+
c = "GMapTypeControl"
|
134
|
+
when :menu_type
|
135
|
+
c = "GMenuMapTypeControl"
|
136
|
+
when :hierachical_type
|
137
|
+
c = "GHierarchicalMapTypeControl"
|
138
|
+
when :zoom
|
139
|
+
c = "GSmallZoomControl"
|
140
|
+
when :zoom_3d
|
141
|
+
c = "GSmallZoomControl3D"
|
142
|
+
when :nav_label
|
143
|
+
c = "GNavLabelControl"
|
144
|
+
end
|
145
|
+
js << "#{dom_id}.addControl(new #{c}());"
|
146
|
+
end
|
147
|
+
|
148
|
+
return js.join("\n")
|
149
|
+
end
|
150
|
+
|
151
|
+
def markers_functions_js
|
152
|
+
js = []
|
153
|
+
for marker in markers
|
154
|
+
js << marker.open_info_window_function
|
155
|
+
end
|
156
|
+
return js.join("\n")
|
157
|
+
end
|
158
|
+
|
159
|
+
def markers_icons_js
|
160
|
+
icons = []
|
161
|
+
for marker in markers
|
162
|
+
if marker.icon and !icons.include?(marker.icon)
|
163
|
+
icons << marker.icon
|
164
|
+
end
|
165
|
+
end
|
166
|
+
js = []
|
167
|
+
for icon in icons
|
168
|
+
js << icon.to_js
|
169
|
+
end
|
170
|
+
return js.join("\n")
|
171
|
+
end
|
172
|
+
|
173
|
+
# Creates a JS function that centers the map on the specified center
|
174
|
+
# location if given to the initialisers, or on the maps markers if they exist, or
|
175
|
+
# at (0,0) if not.
|
176
|
+
def center_map_js
|
177
|
+
if self.zoom
|
178
|
+
zoom_js = zoom
|
179
|
+
else
|
180
|
+
zoom_js = "#{dom_id}.getBoundsZoomLevel(#{dom_id}_latlng_bounds)"
|
181
|
+
end
|
182
|
+
set_center_js = []
|
183
|
+
|
184
|
+
if self.center
|
185
|
+
set_center_js << "#{dom_id}.setCenter(new GLatLng(#{center.lat}, #{center.lng}), #{zoom_js});"
|
186
|
+
else
|
187
|
+
synch_bounds
|
188
|
+
set_center_js << "var #{dom_id}_latlng_bounds = new GLatLngBounds();"
|
189
|
+
|
190
|
+
bounds.each do |point|
|
191
|
+
set_center_js << "#{dom_id}_latlng_bounds.extend(new GLatLng(#{point.lat}, #{point.lng}));"
|
192
|
+
end
|
193
|
+
|
194
|
+
set_center_js << "#{dom_id}.setCenter(#{dom_id}_latlng_bounds.getCenter(), #{zoom_js});"
|
195
|
+
end
|
196
|
+
|
197
|
+
"function center_#{dom_id}() {\n #{check_resize_js}\n #{set_center_js.join "\n"}\n}"
|
198
|
+
end
|
199
|
+
|
200
|
+
def synch_bounds
|
201
|
+
|
202
|
+
overlays.each do |overlay|
|
203
|
+
if overlay.is_a? GoogleMap::Polyline
|
204
|
+
overlay.vertices.each do |v|
|
205
|
+
bounds << v #i do not like this inconsistent interface
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
markers.each do |m|
|
211
|
+
bounds << m
|
212
|
+
end
|
213
|
+
|
214
|
+
bounds.uniq!
|
215
|
+
end
|
216
|
+
|
217
|
+
def check_resize_js
|
218
|
+
return "#{dom_id}.checkResize();"
|
219
|
+
end
|
220
|
+
|
221
|
+
def center_on_bounds_js
|
222
|
+
return "center_#{dom_id}();"
|
223
|
+
end
|
224
|
+
|
225
|
+
def div(width = '100%', height = '100%')
|
226
|
+
"<div id='#{dom_id}' style='width: #{width}; height: #{height}'></div>"
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
# class Map
|
233
|
+
# #include Reloadable
|
234
|
+
# include UnbackedDomId
|
235
|
+
# attr_accessor :dom_id,
|
236
|
+
# :markers,
|
237
|
+
# :polylines,
|
238
|
+
# :controls,
|
239
|
+
# :inject_on_load,
|
240
|
+
# :zoom
|
241
|
+
#
|
242
|
+
# def initialize(options = {})
|
243
|
+
# self.dom_id = 'google_map'
|
244
|
+
# self.markers = []
|
245
|
+
# self.polylines = []
|
246
|
+
# self.controls = [ :zoom, :overview, :scale, :type ]
|
247
|
+
# options.each_pair { |key, value| send("#{key}=", value) }
|
248
|
+
# end
|
249
|
+
#
|
250
|
+
# def to_html
|
251
|
+
# html = []
|
252
|
+
#
|
253
|
+
# html << "<script src='http://maps.google.com/maps?file=api&v=2&key=#{GOOGLE_APPLICATION_ID}' type='text/javascript'></script>"
|
254
|
+
# html << "<script type=\"text/javascript\">\n/* <![CDATA[ */\n"
|
255
|
+
# html << to_js
|
256
|
+
# html << "/* ]]> */</script> "
|
257
|
+
#
|
258
|
+
# return html.join("\n")
|
259
|
+
# end
|
260
|
+
#
|
261
|
+
# def to_js
|
262
|
+
# js = []
|
263
|
+
#
|
264
|
+
# # Initialise the map variable so that it can externally accessed.
|
265
|
+
# js << "var #{dom_id};"
|
266
|
+
#
|
267
|
+
# markers.each { |marker| js << "var #{marker.dom_id};" }
|
268
|
+
#
|
269
|
+
# js << markers_functions_js
|
270
|
+
#
|
271
|
+
# js << center_on_markers_function_js
|
272
|
+
#
|
273
|
+
# js << "function initialize_google_map_#{dom_id}() {"
|
274
|
+
# js << " if(GBrowserIsCompatible()) {"
|
275
|
+
# js << " #{dom_id} = new GMap2(document.getElementById('#{dom_id}'));"
|
276
|
+
#
|
277
|
+
# js << " if (self['GoogleMapOnLoad']) {"
|
278
|
+
# # added by Patrick to enable load functions
|
279
|
+
# js << "#{dom_id}.load = GEvent.addListener(#{dom_id},'load',GoogleMapOnLoad)"
|
280
|
+
# js << "}"
|
281
|
+
# js << ' ' + controls_js
|
282
|
+
#
|
283
|
+
# js << ' ' + center_on_markers_js
|
284
|
+
#
|
285
|
+
# js << ' ' + markers_icons_js
|
286
|
+
#
|
287
|
+
# # Put all the markers on the map.
|
288
|
+
# for marker in markers
|
289
|
+
# js << ' ' + marker.to_js
|
290
|
+
# js << ''
|
291
|
+
# end
|
292
|
+
#
|
293
|
+
# for polyline in polylines
|
294
|
+
# js << ' ' + polyline.to_js
|
295
|
+
# js << ''
|
296
|
+
# end
|
297
|
+
#
|
298
|
+
# js << ' ' + inject_on_load.gsub("\n", " \n") if inject_on_load
|
299
|
+
# js << " }"
|
300
|
+
# js << "}"
|
301
|
+
#
|
302
|
+
# # Load the map on window load preserving anything already on window.onload.
|
303
|
+
# js << "if (typeof window.onload != 'function') {"
|
304
|
+
# js << " window.onload = initialize_google_map_#{dom_id};"
|
305
|
+
# js << "} else {"
|
306
|
+
# js << " old_before_google_map_#{dom_id} = window.onload;"
|
307
|
+
# js << " window.onload = function() {"
|
308
|
+
# js << " old_before_google_map_#{dom_id}();"
|
309
|
+
# js << " initialize_google_map_#{dom_id}();"
|
310
|
+
# js << " }"
|
311
|
+
# js << "}"
|
312
|
+
#
|
313
|
+
# # Unload the map on window load preserving anything already on window.onunload.
|
314
|
+
# #js << "if (typeof window.onunload != 'function') {"
|
315
|
+
# #js << " window.onunload = GUnload();"
|
316
|
+
# #js << "} else {"
|
317
|
+
# #js << " old_before_onunload = window.onload;"
|
318
|
+
# #js << " window.onunload = function() {"
|
319
|
+
# #js << " old_before_onunload;"
|
320
|
+
# #js << " GUnload();"
|
321
|
+
# #js << " }"
|
322
|
+
# #js << "}"
|
323
|
+
#
|
324
|
+
# return js.join("\n")
|
325
|
+
# end
|
326
|
+
#
|
327
|
+
# def controls_js
|
328
|
+
# js = []
|
329
|
+
#
|
330
|
+
# controls.each do |control|
|
331
|
+
# case control
|
332
|
+
# when :large, :small, :overview
|
333
|
+
# c = "G#{control.to_s.capitalize}MapControl"
|
334
|
+
# when :scale
|
335
|
+
# c = "GScaleControl"
|
336
|
+
# when :type
|
337
|
+
# c = "GMapTypeControl"
|
338
|
+
# when :zoom
|
339
|
+
# c = "GSmallZoomControl"
|
340
|
+
# end
|
341
|
+
# js << "#{dom_id}.addControl(new #{c}());"
|
342
|
+
# end
|
343
|
+
#
|
344
|
+
# return js.join("\n")
|
345
|
+
# end
|
346
|
+
#
|
347
|
+
# def markers_functions_js
|
348
|
+
# js = []
|
349
|
+
#
|
350
|
+
# for marker in markers
|
351
|
+
# js << marker.open_info_window_function
|
352
|
+
# end
|
353
|
+
#
|
354
|
+
# return js.join("\n")
|
355
|
+
# end
|
356
|
+
#
|
357
|
+
# def markers_icons_js
|
358
|
+
# icons = []
|
359
|
+
#
|
360
|
+
# for marker in markers
|
361
|
+
# if marker.icon and !icons.include?(marker.icon)
|
362
|
+
# icons << marker.icon
|
363
|
+
# end
|
364
|
+
# end
|
365
|
+
#
|
366
|
+
# js = []
|
367
|
+
#
|
368
|
+
# for icon in icons
|
369
|
+
# js << icon.to_js
|
370
|
+
# end
|
371
|
+
#
|
372
|
+
# return js.join("\n")
|
373
|
+
# end
|
374
|
+
#
|
375
|
+
# # Creates a JS function that centers the map on its markers.
|
376
|
+
# def center_on_markers_function_js
|
377
|
+
# if markers.size == 0 and polylines.size == 0
|
378
|
+
# set_center_js = "#{dom_id}.setCenter(new GLatLng(0, 0), 0);"
|
379
|
+
# else
|
380
|
+
#
|
381
|
+
# for marker in markers
|
382
|
+
# min_lat = marker.lat if !min_lat or marker.lat < min_lat
|
383
|
+
# max_lat = marker.lat if !max_lat or marker.lat > max_lat
|
384
|
+
# min_lng = marker.lng if !min_lng or marker.lng < min_lng
|
385
|
+
# max_lng = marker.lng if !max_lng or marker.lng > max_lng
|
386
|
+
# end
|
387
|
+
#
|
388
|
+
# for polyline in polylines
|
389
|
+
# polyline.points.each do |point|
|
390
|
+
# min_lat = point.lat if !min_lat or point.lat < min_lat
|
391
|
+
# max_lat = point.lat if !max_lat or point.lat > max_lat
|
392
|
+
# min_lng = point.lng if !min_lng or point.lng < min_lng
|
393
|
+
# max_lng = point.lng if !max_lng or point.lng > max_lng
|
394
|
+
# end
|
395
|
+
# end
|
396
|
+
#
|
397
|
+
# # if no markers or polyline points zero values
|
398
|
+
# min_lat ? min_lat : 0
|
399
|
+
# max_lat ? max_lat : 0
|
400
|
+
# min_lng ? min_lng : 0
|
401
|
+
# max_lng ? max_lng : 0
|
402
|
+
#
|
403
|
+
# if self.zoom
|
404
|
+
# zoom_js = zoom
|
405
|
+
# else
|
406
|
+
# bounds_js = "new GLatLngBounds(new GLatLng(#{min_lat}, #{min_lng}), new GLatLng(#{max_lat}, #{max_lng}))"
|
407
|
+
# zoom_js = "#{dom_id}.getBoundsZoomLevel(#{bounds_js})"
|
408
|
+
# end
|
409
|
+
#
|
410
|
+
# center_js = "new GLatLng(#{(min_lat + max_lat) / 2}, #{(min_lng + max_lng) / 2})"
|
411
|
+
# set_center_js = "#{dom_id}.setCenter(#{center_js}, #{zoom_js});"
|
412
|
+
# end
|
413
|
+
#
|
414
|
+
# return "function center_#{dom_id}() {\n #{check_resize_js}\n #{set_center_js}\n}"
|
415
|
+
# end
|
416
|
+
#
|
417
|
+
# def check_resize_js
|
418
|
+
# return "#{dom_id}.checkResize();"
|
419
|
+
# end
|
420
|
+
#
|
421
|
+
# def center_on_markers_js
|
422
|
+
# return "center_#{dom_id}();"
|
423
|
+
# end
|
424
|
+
#
|
425
|
+
# def div(width = '100%', height = '100%')
|
426
|
+
# "<div id='#{dom_id}' style='width: #{width}; height: #{height}'></div>"
|
427
|
+
# end
|
428
|
+
#
|
429
|
+
# end
|
430
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class Marker
|
4
|
+
|
5
|
+
include ActionView::Helpers::JavaScriptHelper
|
6
|
+
|
7
|
+
attr_accessor :dom_id,
|
8
|
+
:lat,
|
9
|
+
:lng,
|
10
|
+
:html,
|
11
|
+
:marker_icon_path,
|
12
|
+
:marker_hover_text,
|
13
|
+
:map,
|
14
|
+
:icon,
|
15
|
+
:open_infoWindow,
|
16
|
+
:draggable,
|
17
|
+
:dragstart,
|
18
|
+
:dragend
|
19
|
+
|
20
|
+
def initialize(options = {})
|
21
|
+
options.each_pair { |key, value| send("#{key}=", value) }
|
22
|
+
|
23
|
+
if lat.blank? or lng.blank? or !map or !map.kind_of?(GoogleMap::Map)
|
24
|
+
raise "Must set lat, lng, and map for GoogleMapMarker."
|
25
|
+
end
|
26
|
+
|
27
|
+
if dom_id.blank?
|
28
|
+
# This needs self to set the attr_accessor, why?
|
29
|
+
self.dom_id = "#{map.dom_id}_marker_#{map.markers.size + 1}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def open_info_window_function
|
35
|
+
js = []
|
36
|
+
|
37
|
+
js << "function #{dom_id}_infowindow_function() {"
|
38
|
+
js << " #{dom_id}.openInfoWindowHtml(\"#{escape_javascript(html)}\")"
|
39
|
+
js << "}"
|
40
|
+
|
41
|
+
return js.join("\n")
|
42
|
+
end
|
43
|
+
|
44
|
+
def open_info_window
|
45
|
+
"#{dom_id}_infowindow_function();"
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_js
|
49
|
+
js = []
|
50
|
+
|
51
|
+
h = ", title: '#{escape_javascript(marker_hover_text)}'" if marker_hover_text
|
52
|
+
|
53
|
+
# If a icon is specified, use it in marker creation.
|
54
|
+
i = ", { icon: #{icon.dom_id} #{h} }" if icon
|
55
|
+
i = ", { icon: new GIcon( G_DEFAULT_ICON, '#{marker_icon_path}') #{h} }" if marker_icon_path
|
56
|
+
|
57
|
+
options = ', { draggable: true }' if self.draggable
|
58
|
+
js << "#{dom_id} = new GMarker( new GLatLng( #{lat}, #{lng} ) #{i} #{options} );"
|
59
|
+
js << "GEvent.bind(#{dom_id}, \"dragstart\", #{dom_id}, #{self.dragstart});" if dragstart
|
60
|
+
js << "GEvent.bind(#{dom_id}, \"dragend\", #{dom_id}, #{self.dragend});" if dragend
|
61
|
+
|
62
|
+
if self.html
|
63
|
+
js << "GEvent.addListener(#{dom_id}, 'click', function() {#{dom_id}_infowindow_function()});"
|
64
|
+
end
|
65
|
+
|
66
|
+
js << "#{map.dom_id}.addOverlay(#{dom_id});"
|
67
|
+
|
68
|
+
if open_infoWindow
|
69
|
+
js << "GEvent.trigger(#{dom_id}, 'click')"
|
70
|
+
end
|
71
|
+
|
72
|
+
return js.join("\n")
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class Point
|
4
|
+
attr_accessor :lat,
|
5
|
+
:lng
|
6
|
+
|
7
|
+
def initialize(lat, lng)
|
8
|
+
self.lat = lat
|
9
|
+
self.lng = lng
|
10
|
+
if lat.blank? or lng.blank?
|
11
|
+
raise "Must set lat, lng for GoogleMap::Point."
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_js
|
17
|
+
return "new GLatLng(#{self.lat}, #{self.lng})"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class Polyline
|
4
|
+
#include Reloadable
|
5
|
+
include UnbackedDomId
|
6
|
+
|
7
|
+
attr_accessor :dom_id,
|
8
|
+
:map,
|
9
|
+
:vertices,
|
10
|
+
:color,
|
11
|
+
:weight,
|
12
|
+
:opacity
|
13
|
+
|
14
|
+
def initialize(options = {})
|
15
|
+
self.vertices = []
|
16
|
+
self.color = "#000"
|
17
|
+
self.weight = 1
|
18
|
+
self.opacity = 1
|
19
|
+
options.each_pair { |key, value| send("#{key}=", value) }
|
20
|
+
if !map or !map.kind_of?(GoogleMap::Map)
|
21
|
+
raise "Must set map for GoogleMap::Polyline."
|
22
|
+
end
|
23
|
+
if dom_id.blank?
|
24
|
+
# This needs self to set the attr_accessor, why?
|
25
|
+
self.dom_id = "#{map.dom_id}_marker_#{map.markers.size + 1}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_js
|
30
|
+
|
31
|
+
js = []
|
32
|
+
js << "#{dom_id}_vertices = new Array();"
|
33
|
+
vertices.each_with_index do |point, index|
|
34
|
+
js << "#{dom_id}_vertices[#{index}] = new GLatLng(#{point.lat}, #{point.lng});"
|
35
|
+
end
|
36
|
+
|
37
|
+
js << "#{dom_id} = new GPolyline(#{dom_id}_vertices, '#{color}', #{weight}, #{opacity});"
|
38
|
+
|
39
|
+
js.join "\n"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
|
3
|
+
class SmallIcon < GoogleMap::Icon
|
4
|
+
#include Reloadable
|
5
|
+
|
6
|
+
alias_method :parent_initialize, :initialize
|
7
|
+
|
8
|
+
def initialize( map, color = 'red')
|
9
|
+
parent_initialize(:width => 12,
|
10
|
+
:height => 20,
|
11
|
+
:shadow_width => 22,
|
12
|
+
:shadow_height => 20,
|
13
|
+
:image_url => "http://labs.google.com/ridefinder/images/mm_20_#{color}.png",
|
14
|
+
:shadow_url => "http://labs.google.com/ridefinder/images/mm_20_shadow.png",
|
15
|
+
:anchor_x => 6,
|
16
|
+
:anchor_y => 20,
|
17
|
+
:info_anchor_x => 5,
|
18
|
+
:info_anchor_y => 1,
|
19
|
+
:map => map)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/google_map.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module GoogleMap
|
2
|
+
# require 'google_map/bounding_box'
|
3
|
+
# require 'google_map/clusterer'
|
4
|
+
require 'google_map/geo_xml'
|
5
|
+
require 'google_map/icon'
|
6
|
+
require 'google_map/letter_icon'
|
7
|
+
require 'google_map/map'
|
8
|
+
require 'google_map/marker'
|
9
|
+
require 'google_map/marker_group'
|
10
|
+
require 'google_map/point'
|
11
|
+
require 'google_map/polyline'
|
12
|
+
require 'google_map/small_icon'
|
13
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# UnbackedDomId
|
2
|
+
module UnbackedDomId
|
3
|
+
##
|
4
|
+
# Implementation of http://codefluency.com/articles/2006/05/30/rails-views-dom-id-scheme
|
5
|
+
#
|
6
|
+
# my_special_race_car.dom_id
|
7
|
+
# => "race_car_1"
|
8
|
+
#
|
9
|
+
# another_race_car.dom_id
|
10
|
+
# => "race_car_2"
|
11
|
+
#
|
12
|
+
def dom_id(prefix=nil)
|
13
|
+
id = self.object_id.to_s.gsub('-', '_')
|
14
|
+
class_name = self.class.name.gsub(/::/, '/').
|
15
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
16
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
17
|
+
tr("-", "_").
|
18
|
+
downcase
|
19
|
+
prefix = prefix.nil? ? class_name : "#{prefix}_#{class_name}"
|
20
|
+
"#{prefix}_#{id}"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
GOOGLE_APPLICATION_ID = "ABQIAAAA3HdfrnxFAPWyY-aiJUxmqRTJQa0g3IQ9GZqIMmInSLzwtGDKaBQ0KYLwBEKSM7F9gCevcsIf6WPuIQ"
|
4
|
+
|
5
|
+
class GoogleMapTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@map = GoogleMap::Map.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_new_map_has_empty_markers
|
11
|
+
assert @map.markers.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_add_markers
|
15
|
+
(1..5).each do |i|
|
16
|
+
@map.markers << marker_factory
|
17
|
+
assert_equal @map.markers.length, i
|
18
|
+
# puts @map.to_html
|
19
|
+
assert @map.to_html.include? " google_map_marker_#{i} = new GMarker( new GLatLng( 40, -100 ) );"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_center_on_markers_function_for_empty_map
|
24
|
+
assert @map.center_map_js.include? "google_map.setCenter(google_map_latlng_bounds.getCenter(), google_map.getBoundsZoomLevel(google_map_latlng_bounds));"
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_center_on_markers_function_for_one_marker
|
28
|
+
@map.markers << marker_factory
|
29
|
+
assert @map.center_map_js.include? "google_map_latlng_bounds.extend(new GLatLng(40, -100));"
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_center_on_markers_function_for_two_markers
|
33
|
+
@map.markers << marker_factory
|
34
|
+
@map.markers << marker_factory({:lng => 100})
|
35
|
+
assert @map.center_map_js.include? "google_map_latlng_bounds.extend(new GLatLng(40, 100));"
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_set_center_with_options
|
39
|
+
@map = GoogleMap::Map.new({:center => GoogleMap::Point.new(10, 10)})
|
40
|
+
@map.markers << marker_factory
|
41
|
+
assert @map.center_map_js.include? "new GLatLng(10, 10)"
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_add_polylines
|
45
|
+
(1..5).each do |i|
|
46
|
+
@map.overlays << polyline_factory
|
47
|
+
assert_equal @map.overlays.length, i
|
48
|
+
assert @map.to_html.include? "#{@map.overlays[i - 1].dom_id} = new GPolyline(#{@map.overlays[i - 1].dom_id}_vertices, '#00FF00', 10, 2);"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_add_geoxml
|
53
|
+
(1..5).each do |i|
|
54
|
+
@map.overlays << geoxml_factory
|
55
|
+
assert_equal @map.overlays.length, i
|
56
|
+
assert @map.to_html.include? "#{@map.overlays[i - 1].dom_id} = new GGeoXml('http://code.google.com/apis/kml/documentation/KML_Samples.kml')";
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_map_type
|
61
|
+
assert !@map.to_html.include?("setMapType(GoogleMap)")
|
62
|
+
@map.map_type = "foo"
|
63
|
+
assert @map.to_html.include? "setMapType(foo)"
|
64
|
+
end
|
65
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
ENV['RAILS_ENV'] = 'test'
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'action_pack'
|
6
|
+
require 'action_view'
|
7
|
+
require 'lib/unbacked_dom_id'
|
8
|
+
require 'lib/google_map'
|
9
|
+
require 'lib/google_map/bounding_box'
|
10
|
+
require 'lib/google_map/clusterer'
|
11
|
+
require 'lib/google_map/geo_xml'
|
12
|
+
require 'lib/google_map/icon'
|
13
|
+
require 'lib/google_map/letter_icon'
|
14
|
+
require 'lib/google_map/map'
|
15
|
+
require 'lib/google_map/marker'
|
16
|
+
require 'lib/google_map/marker_group'
|
17
|
+
require 'lib/google_map/point'
|
18
|
+
require 'lib/google_map/polyline'
|
19
|
+
require 'lib/google_map/small_icon'
|
20
|
+
|
21
|
+
def marker_factory(options = {})
|
22
|
+
params = {
|
23
|
+
:map => @map,
|
24
|
+
:lat => 40,
|
25
|
+
:lng => -100,
|
26
|
+
:html => 'Test Marker'
|
27
|
+
}.merge(options)
|
28
|
+
GoogleMap::Marker.new(params)
|
29
|
+
end
|
30
|
+
|
31
|
+
def polyline_factory(options = {})
|
32
|
+
params = {
|
33
|
+
:map => @map,
|
34
|
+
:color => "#00FF00",
|
35
|
+
:weight => 10,
|
36
|
+
:opacity => 2,
|
37
|
+
:vertices => [
|
38
|
+
GoogleMap::Point.new(40, -100),
|
39
|
+
GoogleMap::Point.new(40, 100)]
|
40
|
+
}.merge(options)
|
41
|
+
GoogleMap::Polyline.new(params)
|
42
|
+
end
|
43
|
+
|
44
|
+
def geoxml_factory(options = {})
|
45
|
+
params = {
|
46
|
+
:url_of_xml => "http://code.google.com/apis/kml/documentation/KML_Samples.kml"
|
47
|
+
}.merge(options)
|
48
|
+
GoogleMap::GeoXml.new(params)
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google_map
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jeff Dutil
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-22 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Extends geokit and gives convenient helpers for adding google maps to your Rails applicaiton.
|
23
|
+
email:
|
24
|
+
- JDutil@BurlingtonWebApps.com
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- MIT_LICENSE.txt
|
35
|
+
- README
|
36
|
+
- Rakefile
|
37
|
+
- google_map.gemspec
|
38
|
+
- lib/google_map.rb
|
39
|
+
- lib/google_map/bounding_box.rb
|
40
|
+
- lib/google_map/clusterer.rb
|
41
|
+
- lib/google_map/geo_xml.rb
|
42
|
+
- lib/google_map/icon.rb
|
43
|
+
- lib/google_map/letter_icon.rb
|
44
|
+
- lib/google_map/map.rb
|
45
|
+
- lib/google_map/marker.rb
|
46
|
+
- lib/google_map/marker_group.rb
|
47
|
+
- lib/google_map/point.rb
|
48
|
+
- lib/google_map/polyline.rb
|
49
|
+
- lib/google_map/small_icon.rb
|
50
|
+
- lib/google_map/version.rb
|
51
|
+
- lib/unbacked_dom_id.rb
|
52
|
+
- test/google_map_test.rb
|
53
|
+
- test/test_helper.rb
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: https://github.com/jdutil/google_map
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
requirements: []
|
82
|
+
|
83
|
+
rubyforge_project: google_map
|
84
|
+
rubygems_version: 1.5.0
|
85
|
+
signing_key:
|
86
|
+
specification_version: 3
|
87
|
+
summary: Extends geokit and gives convenient helpers for adding google maps to your Rails applicaiton.
|
88
|
+
test_files:
|
89
|
+
- test/google_map_test.rb
|
90
|
+
- test/test_helper.rb
|