gmaps4rails 0.1.0 → 0.2.0
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/README.rdoc +73 -64
- data/app/controllers/gmaps4rails/gmaps_controller.rb +11 -10
- data/app/views/gmaps4rails/_gmaps4rails.html.erb +14 -21
- data/app/views/gmaps4rails/gmaps/index.js.erb +18 -26
- data/config/routes.rb +0 -8
- data/lib/acts_as_gmappable/base.rb +46 -43
- data/lib/application_helper.rb +3 -11
- data/lib/gmaps4rails.rb +3 -18
- data/public/images/marker.png +0 -0
- data/public/javascripts/gmaps4rails.js +112 -129
- data/public/javascripts/old.js +144 -0
- metadata +11 -10
data/README.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
== Gmaps4rails
|
2
2
|
|
3
|
-
Gmaps4rails is developped to simply create a
|
4
|
-
It's based on Rails 3 Engines.
|
3
|
+
Gmaps4rails is developped to simply create a Google Map (Gmaps) with model instances (say Users).
|
4
|
+
It's based on Ruby on Rails 3 Engines.
|
5
5
|
It works properly but I still have something to correct: making it work without resorting to the serve_static_assets to true in production.
|
6
6
|
|
7
7
|
== Installation
|
@@ -10,87 +10,96 @@ It works properly but I still have something to correct: making it work without
|
|
10
10
|
|
11
11
|
== Requirements
|
12
12
|
- jQuery (used for ajax json)
|
13
|
-
- <%= yield :head %> in your header
|
13
|
+
- <%= yield :head %> (in your header)
|
14
|
+
- <%= yield :scripts %> (in your footer)
|
14
15
|
- config.serve_static_assets = true (in your production.rb)
|
15
16
|
|
16
17
|
== Quickstart
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def gmaps4rails_address
|
21
|
-
self.address #describe how to retrieve the address from your model
|
22
|
-
end
|
18
|
+
Say you have a User model.
|
19
|
+
In your model, add:
|
23
20
|
|
24
|
-
|
25
|
-
self.picture #describe how to retrieve the picture from your model
|
26
|
-
end
|
21
|
+
acts_as_gmappable
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
def gmaps4rails_address
|
24
|
+
self.address #describe how to retrieve the address from your model
|
25
|
+
end
|
31
26
|
|
32
27
|
Create a migration and add the following fields to your table:
|
33
|
-
t.string "gmaps4rails_latitude"
|
34
|
-
t.string "gmaps4rails_longitude"
|
35
|
-
t.boolean "gmaps"
|
36
28
|
|
37
|
-
|
38
|
-
|
29
|
+
add_column :users, :latitude, :float
|
30
|
+
add_column :users, :longitude, :float
|
31
|
+
add_column :users, :gmaps, :boolean
|
32
|
+
|
33
|
+
In your view:
|
39
34
|
|
35
|
+
<%= gmaps4rails_map("User") %>
|
40
36
|
|
41
37
|
== Options
|
42
38
|
|
43
|
-
===
|
44
|
-
|
39
|
+
=== Add an info window
|
40
|
+
To add an info window (visible when you click a marker), add this method in your model:
|
41
|
+
|
42
|
+
def gmaps4rails_infowindow
|
43
|
+
# add here whatever html content you desire, it will be displayed when users clicks on the marker
|
44
|
+
end
|
45
|
+
|
46
|
+
=== List of Options
|
47
|
+
You can customize the following:
|
48
|
+
|
49
|
+
processing: 'rails_model', //or 'json'
|
50
|
+
marker_picture : 'http://www.mbs.edu/i/gmap_marker_default.gif,
|
51
|
+
model_scope : null,
|
52
|
+
marker_width : 22,
|
53
|
+
marker_length : 32,
|
54
|
+
map_center_latitude : 0,
|
55
|
+
map_center_longitude : 0,
|
56
|
+
map_zoom : 1,
|
57
|
+
do_clustering: true,
|
58
|
+
clusterer_gridSize: 50,
|
59
|
+
clusterer_maxZoom: 10
|
60
|
+
|
61
|
+
=== How to set your own options
|
62
|
+
Change the call in your view this way and add an additional hash containing the options you want:
|
63
|
+
<%= gmaps4rails_map("User", {"map_center_longitude" => "90", "do_clustering" => false}) %>
|
45
64
|
|
46
65
|
=== Scopes (displays a dropdown list enabling you to filter the map content)
|
47
|
-
|
48
|
-
|
49
|
-
scope :low_height, lambda {|height|
|
50
|
-
where("users.height <= ?", height)
|
51
|
-
}
|
52
|
-
scope :high_height, lambda {|height|
|
53
|
-
where("users.height >= ?", height)
|
54
|
-
}
|
55
|
-
|
56
|
-
# method to fill in the dropdown list: provide scope argument, variable to pass to it, and text you want to display
|
57
|
-
def self.gmaps4rails_filters
|
58
|
-
[
|
59
|
-
{"filter" => "All", "options" => "", "display" => "All"},
|
60
|
-
{"filter" => "low", "options" => "130", "display" => "People Under 130cm"},
|
61
|
-
{"filter" => "low", "options" => "100", "display" => "People Under 100cm"},
|
62
|
-
{"filter" => "high", "options" =>"190", "display" => "People Above 190cm"},
|
63
|
-
{"filter" => "high", "options" =>"200", "display" => "People Above 200cm"}
|
64
|
-
]
|
65
|
-
end
|
66
|
-
|
67
|
-
# method to filter your requests given the parameters you provided above
|
68
|
-
def self.gmaps4rails_filter(filter, options)
|
69
|
-
case filter
|
70
|
-
when 'low' then self.low_height(options)
|
71
|
-
when 'high' then self.high_height(options)
|
72
|
-
else self.all
|
73
|
-
end
|
74
|
-
end
|
66
|
+
Note that you can pass a model_scope in the options to filter the data you want to be displayed.
|
67
|
+
So as above, change the call in your view:
|
75
68
|
|
76
|
-
|
77
|
-
<%=raw gmaps4rails_filters_display("User") %>
|
69
|
+
<%= gmaps4rails_map("User", {"model_scope" => "my_scope"}) %>
|
78
70
|
|
79
|
-
|
80
|
-
In your model, add the following:
|
71
|
+
In this case, you must add in your model:
|
81
72
|
|
82
|
-
def self.
|
83
|
-
|
84
|
-
"width" => 22,
|
85
|
-
"length" => 32 }
|
73
|
+
def self.gmaps4rails_trusted_scopes
|
74
|
+
["my_scope", "another_trusted_scope"]
|
86
75
|
end
|
87
76
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
77
|
+
Why? because you shall never trust the params, so it's a way to keep control.
|
78
|
+
|
79
|
+
=== Create from your own json
|
80
|
+
If you want to use your own json to initialize the map, create your json with the following attributes
|
81
|
+
|
82
|
+
@json = '[
|
83
|
+
{"description": "", "longitude": "", "latitude": "", "picture": "", "width": "", "height": ""},
|
84
|
+
{"longitude": "", "latitude": "" }
|
85
|
+
]'
|
86
|
+
|
87
|
+
Only `latitude` and `longitude` are mandatory. But you can customize any single marker.
|
88
|
+
|
89
|
+
Then in your view:
|
90
|
+
|
91
|
+
<%= gmaps4rails_map(@json, { "processing" => 'json' }) %>
|
92
|
+
|
93
|
+
Or with options as well:
|
94
|
+
|
95
|
+
<%= gmaps4rails_map("json", @json, {"processing" => 'json', "map_center_longitude" => "90"}) %>
|
96
|
+
|
97
|
+
|
98
|
+
== Todo?
|
99
|
+
|
100
|
+
Maybe use Geokit to handle the geocoding stuff.
|
92
101
|
|
93
102
|
Feel free ton contact me, you have your say. I hope I'll have time enough to improve it.
|
94
|
-
== Copyright
|
95
103
|
|
96
|
-
Copyright
|
104
|
+
== Copyright
|
105
|
+
Copyright (c) 2011 apneadiving. See LICENSE for details.
|
@@ -3,15 +3,16 @@ module Gmaps4rails
|
|
3
3
|
unloadable
|
4
4
|
|
5
5
|
def index
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
@model = params["model"]
|
7
|
+
@scope = params["scope"]
|
8
|
+
@model = @model.constantize
|
9
|
+
|
10
|
+
if @scope && !@scope.empty? && @model.gmaps4rails_trusted_scopes.include?(@scope)
|
11
|
+
@objects = eval("#{@model}.#{@scope}") # Cannot use send with lambda scope
|
12
|
+
# because the arguments have to be separated
|
13
|
+
else
|
14
|
+
@objects = @model.all
|
15
|
+
end
|
16
|
+
end
|
16
17
|
end
|
17
18
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
<% content_for :head do %>
|
2
2
|
<%= stylesheet_link_tag 'gmaps4rails' %>
|
3
|
-
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :scripts do %>
|
6
|
+
<script src="http://www.google.com/jsapi"></script>
|
4
7
|
<script type="text/javascript" src='http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/1.0/src/markerclusterer.js'></script>
|
8
|
+
<%=javascript_include_tag 'gmaps4rails' %>
|
5
9
|
<script type="text/javascript" charset="utf-8">
|
6
10
|
var styles = [{
|
7
11
|
url: 'http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/1.0/images/people35.png',
|
@@ -11,25 +15,14 @@ var styles = [{
|
|
11
15
|
opt_textColor: '#ff00ff',
|
12
16
|
opt_textSize: 10
|
13
17
|
}];
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
var
|
18
|
-
|
19
|
-
var gmaps4rails_model = '<%= model %>';
|
20
|
-
var gmaps4rails_map_center_lat = <%= model.constantize.gmaps4rails_map_options["latitude"] %>;
|
21
|
-
var gmaps4rails_map_center_long = <%= model.constantize.gmaps4rails_map_options["longitude"] %>;
|
22
|
-
var gmaps4rails_map_zoom = <%= model.constantize.gmaps4rails_map_options["zoom"] %>;
|
23
|
-
var gmaps4rails_base_url = '<%= url_for gmaps_path %>';
|
18
|
+
<% options.each do |key, value| %>
|
19
|
+
Gmaps4Rails.<%= key %> = <%=raw value.is_a?(String) ? "'#{value}'" : value %>;
|
20
|
+
<% end %>
|
21
|
+
var builder = <%=raw options[""] == "json" ? builder : "'#{builder}'" %>;
|
22
|
+
Gmaps4Rails.initialize(builder);
|
24
23
|
</script>
|
25
|
-
<%=javascript_include_tag 'gmaps4rails' %>
|
26
24
|
<% end %>
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
<div id="inline-actions">
|
32
|
-
<input id="gmaps4rails_user_distance" >
|
33
|
-
<input type="submit" value="Filter" class="item" onclick="filter_distance()">
|
34
|
-
</div>
|
35
|
-
<% end %>
|
25
|
+
|
26
|
+
<div id="map-container">
|
27
|
+
<div id="gmaps4rails_map"></div>
|
28
|
+
</div>
|
@@ -1,27 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
long = object.gmaps4rails_longitude.nil? ? "" : object.gmaps4rails_longitude
|
8
|
-
%>
|
9
|
-
{"description": "<%=raw desc %>", "longitude": <%= long %>, "latitude": <%= lat %>, "marker_object": "null"}
|
10
|
-
<% end
|
11
|
-
|
12
|
-
else
|
13
|
-
@objects.each do |object|
|
14
|
-
stat = object.status.nil? ? "" : CGI::escapeHTML(object.status)
|
15
|
-
desc = object.picture.nil? ? "No description provided" : "<img width='40' heigth='40' src='" + object.gmaps4rails_picture + "'>" + stat
|
16
|
-
|
17
|
-
lat = object.gmaps4rails_latitude.nil? ? "" : object.gmaps4rails_latitude
|
18
|
-
long = object.gmaps4rails_longitude.nil? ? "" : object.gmaps4rails_longitude
|
19
|
-
|
20
|
-
if (!(lat == "" || long == "")) %>
|
21
|
-
{"description": "<%=raw desc %>", "longitude": <%= long %>, "latitude": <%= lat %>, "marker_object": "null"} <%= ',' unless object == @objects.last %>
|
22
|
-
<%
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
1
|
+
[
|
2
|
+
<%
|
3
|
+
@objects.each do |object|
|
4
|
+
# lat = object.gmaps4rails_latitude.nil? ? "" : object.gmaps4rails_latitude
|
5
|
+
# long = object.gmaps4rails_longitude.nil? ? "" : object.gmaps4rails_longitude
|
6
|
+
if (!(object.gmaps4rails_latitude == "" || object.gmaps4rails_longitude == ""))
|
26
7
|
%>
|
27
|
-
|
8
|
+
{"description": "<%=raw object.gmaps4rails_infowindow %>",
|
9
|
+
"longitude": "<%= object.gmaps4rails_longitude %>",
|
10
|
+
"latitude": "<%= object.gmaps4rails_latitude %>",
|
11
|
+
"picture": "<%= object.gmaps4rails_marker_picture["picture"] %>",
|
12
|
+
"width": "<%= object.gmaps4rails_marker_picture["width"] %>",
|
13
|
+
"height": "<%= object.gmaps4rails_marker_picture["height"] %>"
|
14
|
+
} <%= ',' unless object == @objects.last %>
|
15
|
+
<%
|
16
|
+
end
|
17
|
+
end
|
18
|
+
%>
|
19
|
+
]
|
data/config/routes.rb
CHANGED
@@ -1,13 +1,5 @@
|
|
1
|
-
#Rails.application.routes.draw do |map|
|
2
1
|
Rails.application.routes.draw do
|
3
2
|
|
4
|
-
#mount_at = Gmaps4rails::Engine.config.mount_at
|
5
|
-
|
6
|
-
#match mount_at => 'gmaps4rails/gmaps#index'
|
7
|
-
|
8
3
|
resources :gmaps, :only => [ :index ], :controller => "gmaps4rails/gmaps"
|
9
|
-
#,
|
10
|
-
# :path_prefix => mount_at
|
11
|
-
#:name_prefix => "gmaps4rails_"
|
12
4
|
|
13
5
|
end
|
@@ -15,57 +15,60 @@ module Gmaps4rails
|
|
15
15
|
module Config
|
16
16
|
def acts_as_gmappable options = {}
|
17
17
|
before_save :get_coordinates
|
18
|
-
|
19
|
-
def self.is_gmappable?
|
20
|
-
true
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.gmaps4rails_markers_pic
|
24
|
-
{ "picture" =>'http://inmotionchiro.com/gmap_plugin/imgs/markers/marker.png',
|
25
|
-
"width" => 22,
|
26
|
-
"length" => 32 }
|
27
|
-
end
|
28
|
-
|
29
|
-
def gmaps4rails_map_options
|
30
|
-
{ "zoom" =>1, "latitude" => 0, "longitude" => 0}
|
31
|
-
end
|
32
|
-
|
33
18
|
include Gmaps4rails::ActsAsGmappable::Base::InstanceMethods
|
34
19
|
end
|
35
20
|
end
|
36
21
|
|
37
22
|
module InstanceMethods
|
38
|
-
|
23
|
+
|
24
|
+
def gmaps4rails_infowindow
|
25
|
+
self.gmaps4rails_picture.blank? ? "" : "<img width='40' heigth='40' src='" + self.gmaps4rails_picture + "'>"
|
26
|
+
end
|
27
|
+
|
28
|
+
def gmaps4rails_picture
|
29
|
+
""
|
30
|
+
end
|
31
|
+
|
32
|
+
def gmaps4rails_marker_picture
|
33
|
+
{
|
34
|
+
"picture" => "",
|
35
|
+
"width" => "",
|
36
|
+
"height" => ""
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.gmaps4rails_trusted_scopes
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
|
39
44
|
def get_coordinates
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
#saves a boolean to remind the status
|
62
|
-
self.gmaps = true
|
63
|
-
end
|
64
|
-
else
|
65
|
-
self.gmaps = false
|
45
|
+
if self.gmaps4rails_address.nil? || self.gmaps4rails_address.empty?
|
46
|
+
self.gmaps = false
|
47
|
+
else
|
48
|
+
geocoder = "http://maps.googleapis.com/maps/api/geocode/json?address="
|
49
|
+
output = "&sensor=false"
|
50
|
+
#send request to the google api to get the lat/lng
|
51
|
+
request = geocoder + self.gmaps4rails_address + output
|
52
|
+
url = URI.escape(request)
|
53
|
+
resp = Net::HTTP.get_response(URI.parse(url))
|
54
|
+
#parse result if result received properly
|
55
|
+
if resp.inspect.include?('HTTPOK 200 OK')
|
56
|
+
#parse the json
|
57
|
+
parse = Crack::JSON.parse(resp.body)
|
58
|
+
#check if google went well
|
59
|
+
if parse["status"] == "OK"
|
60
|
+
#TODO maybe handle case when there are many results
|
61
|
+
#TODO store the country name and maybe other details?
|
62
|
+
self.gmaps4rails_latitude = parse["results"].first["geometry"]["location"]["lat"]
|
63
|
+
self.gmaps4rails_longitude = parse["results"].first["geometry"]["location"]["lng"]
|
64
|
+
#saves a boolean to remind the status
|
65
|
+
self.gmaps = true
|
66
66
|
end
|
67
|
+
else
|
68
|
+
self.gmaps = false
|
67
69
|
end
|
68
|
-
|
70
|
+
end
|
71
|
+
return true
|
69
72
|
end
|
70
73
|
end # InstanceMethods
|
71
74
|
end
|
data/lib/application_helper.rb
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
module ApplicationHelper
|
2
|
-
|
3
|
-
def
|
4
|
-
|
5
|
-
display = '<form name="gmaps4rails_form">'
|
6
|
-
display += '<select name="gmaps4rails_list" onChange="gmaps4rails_resfreshmap()">'
|
7
|
-
model.constantize.gmaps4rails_filters.each do |filter_hash|
|
8
|
-
display += '<option value="' + filter_hash["filter"] + '+' + filter_hash["options"] +'">' + filter_hash["display"]
|
9
|
-
end
|
10
|
-
display += '</select></form>'
|
11
|
-
end
|
12
|
-
return display
|
2
|
+
|
3
|
+
def gmaps4rails_map(builder, options = {})
|
4
|
+
render :partial => 'gmaps4rails/gmaps4rails', :locals => { :builder => builder, :options => options }
|
13
5
|
end
|
14
6
|
|
15
7
|
end
|
data/lib/gmaps4rails.rb
CHANGED
@@ -1,29 +1,14 @@
|
|
1
1
|
if defined?(Rails) && Rails::VERSION::MAJOR == 3
|
2
2
|
module Gmaps4rails
|
3
|
-
# require 'rails/all'
|
4
3
|
require "rails"
|
5
4
|
require "action_controller"
|
6
|
-
# require 'action_controller'
|
7
5
|
require 'application_helper'
|
8
6
|
require 'acts_as_gmappable/base'
|
9
7
|
|
10
8
|
class Engine < Rails::Engine
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# app.middleware.use ::ActionDispatch::Static, "#{root}/public%s"
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# def self.activate
|
18
|
-
# Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*.rb")) do |c|
|
19
|
-
# Rails.env.production? ? require(c) : load(c)
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
#
|
23
|
-
# config.to_prepare &method(:activate).to_proc
|
24
|
-
# initializer 'gmaps.helper' do |app|
|
25
|
-
# ActionView::Base.send :include, Gmaps4rails::GmapsHelper
|
26
|
-
# end
|
9
|
+
initializer "static assets" do |app|
|
10
|
+
app.middleware.use ::ActionDispatch::Static, "#{root}/public"
|
11
|
+
end
|
27
12
|
end
|
28
13
|
end
|
29
14
|
end
|
data/public/images/marker.png
CHANGED
Binary file
|
@@ -1,139 +1,122 @@
|
|
1
1
|
google.load('maps', '3', { other_params: 'sensor=false' });
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
var Gmaps4Rails = {
|
4
|
+
processing: 'rails_model',
|
5
|
+
map: null,
|
6
|
+
marker_picture : 'http://inmotionchiro.com/gmap_plugin/imgs/markers/marker.png',
|
7
|
+
marker_width : 22,
|
8
|
+
marker_length : 32,
|
9
|
+
map_center_latitude : 0,
|
10
|
+
map_center_longitude : 0,
|
11
|
+
map_zoom : 1,
|
12
|
+
base_url : '/gmaps',
|
13
|
+
rails_model : null,
|
14
|
+
model_scope : null,
|
15
|
+
ref_latitude : null,
|
16
|
+
ref_longitude : null,
|
17
|
+
info_window : null,
|
18
|
+
locations : null,
|
19
|
+
markerClusterer: null,
|
20
|
+
do_clustering: true,
|
21
|
+
clusterer_gridSize: 50,
|
22
|
+
clusterer_maxZoom: 10,
|
23
|
+
//Triggers the creation of the map.
|
24
|
+
//Two options:
|
25
|
+
// 1- processing == "rails_model" && builder = model_name
|
26
|
+
// 2- processing == "json" && builder = json in format: [{"description": , "longitude": , "latitude":, "picture": "", "width": "", "length": ""}]
|
27
|
+
initialize: function(builder) {
|
28
|
+
this.reset_map();
|
29
|
+
//infowindow closes when user clicks on the map
|
30
|
+
google.maps.event.addListener(this.map, 'click', function()
|
31
|
+
{ if (this.info_window != null) {this.info_window.close();}
|
32
|
+
});
|
33
|
+
if (this.processing == "rails_model")
|
34
|
+
{
|
35
|
+
this.rails_model = builder;
|
36
|
+
this.create_from_model();
|
37
|
+
}
|
38
|
+
else if (this.processing == "json")
|
39
|
+
{
|
40
|
+
this.locations = builder;
|
41
|
+
this.setup_Markers();
|
42
|
+
}
|
43
|
+
},
|
15
44
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
var myLatLng = new google.maps.LatLng(locations.markers[i].latitude, locations.markers[i].longitude);
|
25
|
-
var ThisMarker = new google.maps.Marker({position: myLatLng, map: gmaps4rails_map, icon: image}); //TODO Offer title customization title: "title"
|
26
|
-
//save object for later use, basically, to get back the text to display when clicking it
|
27
|
-
locations.markers[i].marker_object = ThisMarker;
|
28
|
-
//save the marker again in a list for the clusterer
|
29
|
-
markers.push(ThisMarker);
|
30
|
-
|
31
|
-
//add click listener
|
32
|
-
google.maps.event.addListener(locations.markers[i].marker_object, 'click', function() { if (gmaps4rails_infowindow!=null) {gmaps4rails_infowindow.close();}; getInfoWindow(this);});
|
45
|
+
//resets the map, removes all markers
|
46
|
+
reset_map: function(){
|
47
|
+
this.map = new google.maps.Map(document.getElementById('gmaps4rails_map'), {
|
48
|
+
zoom: this.map_zoom,
|
49
|
+
center: new google.maps.LatLng(this.map_center_latitude, this.map_center_longitude),
|
50
|
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
51
|
+
});
|
52
|
+
},
|
33
53
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
maxZoom: 10,
|
38
|
-
gridSize: 50,
|
39
|
-
//styles: styles TODO: offer clusterer customization
|
40
|
-
});
|
41
|
-
}
|
54
|
+
//creates the necessary query to get the model + scope, and sends json to setup_Markers
|
55
|
+
create_from_model: function (filter_value) {
|
56
|
+
request = this.base_url + '?model=' + this.rails_model;
|
42
57
|
|
43
|
-
|
44
|
-
|
45
|
-
{
|
46
|
-
for ( var m = 0; m < gmaps4rails_data.markers.length; ++m )
|
47
|
-
{
|
48
|
-
var markerInfo = gmaps4rails_data.markers[m].marker_object;
|
49
|
-
if ( markerInfo == which )
|
50
|
-
{
|
51
|
-
gmaps4rails_infowindow = new google.maps.InfoWindow({content: gmaps4rails_data.markers[m].description });
|
52
|
-
gmaps4rails_infowindow.open( gmaps4rails_map, which );
|
53
|
-
return;
|
54
|
-
}
|
55
|
-
}
|
56
|
-
}
|
58
|
+
if(this.model_scope != null)
|
59
|
+
{ request += '&scope=' + this.model_scope; }
|
57
60
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
+
jQuery.getJSON(request,function(data){
|
62
|
+
Gmaps4Rails.locations = data;
|
63
|
+
Gmaps4Rails.setup_Markers();
|
64
|
+
}
|
65
|
+
);
|
66
|
+
},
|
61
67
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
{
|
67
|
-
request += '&filter=' + split_filter_value[0];
|
68
|
-
}
|
69
|
-
if (!(split_filter_value[1] == null))
|
70
|
-
{
|
71
|
-
request += '&options=' + split_filter_value[1];
|
72
|
-
}
|
73
|
-
}
|
74
|
-
jQuery.getJSON(request,
|
75
|
-
function(data){
|
76
|
-
gmaps4rails_data = data;
|
77
|
-
setMarkers(gmaps4rails_data);
|
78
|
-
});
|
79
|
-
}
|
80
|
-
|
81
|
-
function initialize() {
|
82
|
-
gmaps4rails_reset();
|
83
|
-
//infowindow closes when user clicks on the map
|
84
|
-
google.maps.event.addListener(gmaps4rails_map, 'click', function()
|
85
|
-
{ if (gmaps4rails_infowindow != null) {gmaps4rails_infowindow.close();}
|
86
|
-
});
|
87
|
-
create_map();
|
88
|
-
}
|
89
|
-
|
90
|
-
function gmaps4rails_resfreshmap() {
|
91
|
-
gmaps4rails_reset();
|
92
|
-
var index = document.gmaps4rails_form.gmaps4rails_list.selectedIndex;
|
93
|
-
var filter_value = document.gmaps4rails_form.gmaps4rails_list.options[index].value;
|
94
|
-
create_map(filter_value);
|
95
|
-
}
|
96
|
-
|
97
|
-
function gmaps4rails_reset(){
|
98
|
-
gmaps4rails_map = new google.maps.Map(document.getElementById('gmaps4rails_map'), {
|
99
|
-
zoom: gmaps4rails_map_zoom,
|
100
|
-
center: new google.maps.LatLng(gmaps4rails_map_center_lat, gmaps4rails_map_center_long),
|
101
|
-
mapTypeId: google.maps.MapTypeId.ROADMAP
|
102
|
-
});
|
103
|
-
}
|
104
|
-
|
105
|
-
// max_distance in km
|
106
|
-
function filter_distance() {
|
107
|
-
var max_distance = parseInt(document.getElementById('gmaps4rails_user_distance').value, 10);
|
108
|
-
if (!(max_distance>0 || max_distance<0))
|
109
|
-
{
|
110
|
-
alert('Please set the max distance');
|
111
|
-
}
|
112
|
-
else{
|
113
|
-
if (gmaps_circle!=null) { gmaps_circle.setMap(null);}
|
114
|
-
var myCenter = new google.maps.LatLng(gmaps4rails_ref_lat, gmaps4rails_ref_long);
|
115
|
-
var filtered_markers = {"markers":[]};
|
116
|
-
|
68
|
+
//Creates Marker from the locations passed + markerClusterer
|
69
|
+
setup_Markers: function () {
|
70
|
+
//variable used for Marker Clusterer
|
71
|
+
var markers = [];
|
117
72
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
setMarkers(filtered_markers);
|
73
|
+
//resests Clusterer if needed
|
74
|
+
if (this.markerClusterer) {
|
75
|
+
this.markerClusterer.clearMarkers();
|
122
76
|
}
|
123
|
-
|
124
|
-
|
125
|
-
|
77
|
+
// Add markers to the map
|
78
|
+
for (var i = 0; i < this.locations.length; ++i) {
|
79
|
+
|
80
|
+
//test if value passed or use default
|
81
|
+
var marker_picture = this.locations[i].picture != "" && typeof this.locations[i].picture !== "undefined" ? this.locations[i].picture : this.marker_picture;
|
82
|
+
var marker_width = this.locations[i].width != "" && typeof this.locations[i].width !== "undefined" ? this.locations[i].width : this.marker_width;
|
83
|
+
var marker_height = this.locations[i].height != "" && typeof this.locations[i].height !== "undefined" ? this.locations[i].height : this.marker_length;
|
84
|
+
// Marker sizes are expressed as a Size of X,Y
|
85
|
+
var image = new google.maps.MarkerImage(marker_picture,
|
86
|
+
new google.maps.Size(marker_width, marker_height)
|
87
|
+
);
|
88
|
+
var myLatLng = new google.maps.LatLng(this.locations[i].latitude, this.locations[i].longitude);
|
89
|
+
var ThisMarker = new google.maps.Marker({position: myLatLng, map: this.map, icon: image}); //TODO Offer title customization title: "title"
|
90
|
+
//save object for later use, basically, to get back the text to display when clicking it
|
91
|
+
this.locations[i].marker_object = ThisMarker;
|
92
|
+
//save the marker again in a list for the clusterer
|
93
|
+
markers.push(ThisMarker);
|
94
|
+
//add click listener
|
95
|
+
google.maps.event.addListener(Gmaps4Rails.locations[i].marker_object, 'click', function() { if (Gmaps4Rails.info_window!=null) {Gmaps4Rails.info_window.close();}; Gmaps4Rails.getInfoWindow(this);});
|
96
|
+
}
|
97
|
+
if (this.do_clustering == true)
|
98
|
+
{
|
99
|
+
this.markerClusterer = new MarkerClusterer(this.map, markers, {
|
100
|
+
maxZoom: this.clusterer_maxZoom,
|
101
|
+
gridSize: this.clusterer_gridSize,
|
102
|
+
//styles: styles TODO: offer clusterer customization
|
103
|
+
});
|
104
|
+
}
|
105
|
+
},
|
106
|
+
|
107
|
+
//get info_window content when listener calls it
|
108
|
+
getInfoWindow: function(which)
|
109
|
+
{
|
110
|
+
for ( var m = 0; m < this.locations.length; ++m )
|
111
|
+
{
|
112
|
+
var markerInfo = this.locations[m].marker_object;
|
113
|
+
if ( markerInfo == which && this.locations[m].description != "")
|
114
|
+
{
|
115
|
+
this.info_window = new google.maps.InfoWindow({content: this.locations[m].description });
|
116
|
+
this.info_window.open( this.map, which );
|
117
|
+
return;
|
118
|
+
}
|
119
|
+
}
|
126
120
|
}
|
127
|
-
|
128
|
-
|
129
|
-
function get_distance(long1, long2, lat1, lat2) {
|
130
|
-
var theta = long1 - long2;
|
131
|
-
var dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
|
132
|
-
dist = Math.acos(dist);
|
133
|
-
dist = rad2deg(dist);
|
134
|
-
var km = dist * 60 * 1.853;
|
135
|
-
return km;
|
136
|
-
}
|
137
|
-
|
138
|
-
function deg2rad(value) { return value*Math.PI/180;}
|
139
|
-
function rad2deg(value) { return value*180/Math.PI;}
|
121
|
+
|
122
|
+
};
|
@@ -0,0 +1,144 @@
|
|
1
|
+
google.load('maps', '3', { other_params: 'sensor=false' });
|
2
|
+
|
3
|
+
google.setOnLoadCallback(initialize);
|
4
|
+
var gmaps4rails_map = null;
|
5
|
+
var gmaps4rails_data = null;
|
6
|
+
var markerClusterer = null;
|
7
|
+
var gmaps4rails_infowindow = null;
|
8
|
+
var gmaps_circle = null ;
|
9
|
+
|
10
|
+
//put markers on the map + launch the clusterer
|
11
|
+
function setMarkers(locations) {
|
12
|
+
|
13
|
+
//variable used for Marker Clusterer
|
14
|
+
var markers = [];
|
15
|
+
|
16
|
+
if (markerClusterer) {
|
17
|
+
markerClusterer.clearMarkers();
|
18
|
+
}
|
19
|
+
// Add markers to the map
|
20
|
+
for (var i = 0; i < locations.markers.length; ++i) {
|
21
|
+
// Marker sizes are expressed as a Size of X,Y
|
22
|
+
var image = new google.maps.MarkerImage(gmaps4rails_marker_picture,
|
23
|
+
new google.maps.Size(gmaps4rails_marker_width, gmaps4rails_marker_length)
|
24
|
+
);
|
25
|
+
var myLatLng = new google.maps.LatLng(locations.markers[i].latitude, locations.markers[i].longitude);
|
26
|
+
var ThisMarker = new google.maps.Marker({position: myLatLng, map: gmaps4rails_map, icon: image}); //TODO Offer title customization title: "title"
|
27
|
+
//save object for later use, basically, to get back the text to display when clicking it
|
28
|
+
locations.markers[i].marker_object = ThisMarker;
|
29
|
+
//save the marker again in a list for the clusterer
|
30
|
+
markers.push(ThisMarker);
|
31
|
+
|
32
|
+
//add click listener
|
33
|
+
google.maps.event.addListener(locations.markers[i].marker_object, 'click', function() { if (gmaps4rails_infowindow!=null) {gmaps4rails_infowindow.close();}; getInfoWindow(this);});
|
34
|
+
|
35
|
+
}
|
36
|
+
|
37
|
+
markerClusterer = new MarkerClusterer(gmaps4rails_map, markers, {
|
38
|
+
maxZoom: 10,
|
39
|
+
gridSize: 50,
|
40
|
+
//styles: styles TODO: offer clusterer customization
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
//get infowindow content when listener calls it
|
45
|
+
function getInfoWindow(which)
|
46
|
+
{
|
47
|
+
for ( var m = 0; m < gmaps4rails_data.markers.length; ++m )
|
48
|
+
{
|
49
|
+
var markerInfo = gmaps4rails_data.markers[m].marker_object;
|
50
|
+
if ( markerInfo == which )
|
51
|
+
{
|
52
|
+
gmaps4rails_infowindow = new google.maps.InfoWindow({content: gmaps4rails_data.markers[m].description });
|
53
|
+
gmaps4rails_infowindow.open( gmaps4rails_map, which );
|
54
|
+
return;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
//initializes the map
|
60
|
+
function create_map(filter_value) {
|
61
|
+
request = gmaps4rails_base_url + '?model=' + gmaps4rails_model;
|
62
|
+
|
63
|
+
// if(gmaps4rails_scope != null)
|
64
|
+
// request += '&scope=' + gmaps4rails_scope;
|
65
|
+
|
66
|
+
if (!(filter_value == null))
|
67
|
+
{
|
68
|
+
split_filter_value = filter_value.split('+');
|
69
|
+
if (!(split_filter_value[0] == null))
|
70
|
+
{
|
71
|
+
request += '&filter=' + split_filter_value[0];
|
72
|
+
}
|
73
|
+
if (!(split_filter_value[1] == null))
|
74
|
+
{
|
75
|
+
request += '&options=' + split_filter_value[1];
|
76
|
+
}
|
77
|
+
}
|
78
|
+
jQuery.getJSON(request,
|
79
|
+
function(data){
|
80
|
+
gmaps4rails_data = data;
|
81
|
+
setMarkers(gmaps4rails_data);
|
82
|
+
});
|
83
|
+
}
|
84
|
+
|
85
|
+
function initialize() {
|
86
|
+
gmaps4rails_reset();
|
87
|
+
//infowindow closes when user clicks on the map
|
88
|
+
google.maps.event.addListener(gmaps4rails_map, 'click', function()
|
89
|
+
{ if (gmaps4rails_infowindow != null) {gmaps4rails_infowindow.close();}
|
90
|
+
});
|
91
|
+
create_map();
|
92
|
+
}
|
93
|
+
|
94
|
+
function gmaps4rails_resfreshmap() {
|
95
|
+
gmaps4rails_reset();
|
96
|
+
var index = document.gmaps4rails_form.gmaps4rails_list.selectedIndex;
|
97
|
+
var filter_value = document.gmaps4rails_form.gmaps4rails_list.options[index].value;
|
98
|
+
create_map(filter_value);
|
99
|
+
}
|
100
|
+
|
101
|
+
function gmaps4rails_reset(){
|
102
|
+
gmaps4rails_map = new google.maps.Map(document.getElementById('gmaps4rails_map'), {
|
103
|
+
zoom: gmaps4rails_map_zoom,
|
104
|
+
center: new google.maps.LatLng(gmaps4rails_map_center_lat, gmaps4rails_map_center_long),
|
105
|
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
106
|
+
});
|
107
|
+
}
|
108
|
+
|
109
|
+
// max_distance in km
|
110
|
+
function filter_distance() {
|
111
|
+
var max_distance = parseInt(document.getElementById('gmaps4rails_user_distance').value, 10);
|
112
|
+
if (!(max_distance>0 || max_distance<0))
|
113
|
+
{
|
114
|
+
alert('Please set the max distance');
|
115
|
+
}
|
116
|
+
else{
|
117
|
+
if (gmaps_circle!=null) { gmaps_circle.setMap(null);}
|
118
|
+
var myCenter = new google.maps.LatLng(gmaps4rails_ref_lat, gmaps4rails_ref_long);
|
119
|
+
var filtered_markers = {"markers":[]};
|
120
|
+
|
121
|
+
|
122
|
+
for (var i = 0; i < gmaps4rails_data.markers.length; ++i) {
|
123
|
+
if (get_distance(gmaps4rails_ref_long, gmaps4rails_data.markers[i].longitude, gmaps4rails_ref_lat, gmaps4rails_data.markers[i].latitude) < max_distance)
|
124
|
+
{ filtered_markers.markers.push(gmaps4rails_data.markers[i]);}
|
125
|
+
setMarkers(filtered_markers);
|
126
|
+
}
|
127
|
+
//radius is in meters
|
128
|
+
gmaps_circle = new google.maps.Circle({radius: max_distance*1000, center: myCenter, fillColor:"#00FF00", strokeColor: "#00EE00"});
|
129
|
+
gmaps_circle.setMap(gmaps4rails_map);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
function get_distance(long1, long2, lat1, lat2)
|
134
|
+
{
|
135
|
+
var theta = long1 - long2;
|
136
|
+
var dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
|
137
|
+
dist = Math.acos(dist);
|
138
|
+
dist = rad2deg(dist);
|
139
|
+
var km = dist * 60 * 1.853;
|
140
|
+
return km;
|
141
|
+
}
|
142
|
+
|
143
|
+
function deg2rad(value) { return value*Math.PI/180;}
|
144
|
+
function rad2deg(value) { return value*180/Math.PI;}
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gmaps4rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Benjamin Roth
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-13 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: "0"
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
|
-
description: Enables easy display of items (taken from a model) on a Google Map. Uses Javascript API V3.
|
35
|
+
description: Enables easy display of items (taken from a Rails 3 model) on a Google Map. Uses Javascript API V3.
|
36
36
|
email: apnea.diving.deep@gmail.com
|
37
37
|
executables: []
|
38
38
|
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- lib/tasks/install.rake
|
58
58
|
- public/images/marker.png
|
59
59
|
- public/javascripts/gmaps4rails.js
|
60
|
+
- public/javascripts/old.js
|
60
61
|
- public/stylesheets/gmaps4rails.css
|
61
62
|
- README.rdoc
|
62
63
|
- test/test_helper.rb
|
@@ -66,8 +67,8 @@ homepage: http://github.com/apneadiving/Gmaps4rails
|
|
66
67
|
licenses: []
|
67
68
|
|
68
69
|
post_install_message:
|
69
|
-
rdoc_options:
|
70
|
-
|
70
|
+
rdoc_options: []
|
71
|
+
|
71
72
|
require_paths:
|
72
73
|
- lib
|
73
74
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -91,10 +92,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
92
|
requirements: []
|
92
93
|
|
93
94
|
rubyforge_project:
|
94
|
-
rubygems_version: 1.
|
95
|
+
rubygems_version: 1.5.0
|
95
96
|
signing_key:
|
96
97
|
specification_version: 3
|
97
|
-
summary: Enables easy display of items (taken from a model) on a Google Map. Uses Javascript API V3.
|
98
|
+
summary: Enables easy display of items (taken from a Rails 3 model) on a Google Map. Uses Javascript API V3.
|
98
99
|
test_files:
|
99
100
|
- test/test_helper.rb
|
100
101
|
- test/unit/gmaps4rails_widget_test.rb
|