gmaps4rails 0.7.4 → 0.7.5
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/lib/acts_as_gmappable/base.rb +4 -2
- data/lib/hash.rb +4 -0
- data/public/javascripts/gmaps4rails.js +111 -124
- data/test/dummy/app/models/user.rb +3 -2
- data/test/dummy/spec/base/base_spec.rb +1 -1
- metadata +4 -4
@@ -21,7 +21,7 @@ module Gmaps4rails
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def Gmaps4rails.geocode(address)
|
24
|
+
def Gmaps4rails.geocode(address, raw = false)
|
25
25
|
if address.nil? || address.empty?
|
26
26
|
raise Gmaps4rails::GeocodeInvalidQuery, "You must provide an address"
|
27
27
|
else #coordinates are valid
|
@@ -38,12 +38,14 @@ module Gmaps4rails
|
|
38
38
|
#logger.debug "Google geocoding. Address: #{address}. Result: #{resp.body}"
|
39
39
|
#check if google went well
|
40
40
|
if parse["status"] == "OK"
|
41
|
+
return parse if raw == true
|
41
42
|
array = []
|
42
43
|
parse["results"].each do |result|
|
43
44
|
array << {
|
44
45
|
:lat => result["geometry"]["location"]["lat"],
|
45
46
|
:lng => result["geometry"]["location"]["lng"],
|
46
|
-
:matched_address => result["formatted_address"]
|
47
|
+
:matched_address => result["formatted_address"],
|
48
|
+
:bounds => result["geometry"]["bounds"]
|
47
49
|
}
|
48
50
|
end
|
49
51
|
return array
|
data/lib/hash.rb
CHANGED
@@ -22,7 +22,11 @@ class Hash
|
|
22
22
|
#because map should be initialized first, we must extract possible map_options
|
23
23
|
unless self["map_options"].nil?
|
24
24
|
self["map_options"].each do |option_k, option_v|
|
25
|
+
if option_k == "bounds" #particular case
|
26
|
+
result << "Gmaps4Rails.map_options.#{option_k} = #{option_v};"
|
27
|
+
else
|
25
28
|
result << "Gmaps4Rails.map_options.#{option_k} = #{Gmaps4rails.filter option_v};"
|
29
|
+
end
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
@@ -14,8 +14,9 @@ var Gmaps4Rails = {
|
|
14
14
|
zoom : 1,
|
15
15
|
maxZoom: null,
|
16
16
|
minZoom: null,
|
17
|
-
auto_adjust : false,
|
18
|
-
auto_zoom: true
|
17
|
+
auto_adjust : false, //adjust the map to the markers if set to true
|
18
|
+
auto_zoom: true, //zoom given by auto-adjust
|
19
|
+
bounds: [] //adjust map to these limits only (not taken into account if auto_adjust == true). Should be filled with SW and NE
|
19
20
|
},
|
20
21
|
|
21
22
|
//markers + info styling
|
@@ -33,15 +34,11 @@ var Gmaps4Rails = {
|
|
33
34
|
},
|
34
35
|
|
35
36
|
//Stored variables
|
36
|
-
markers : [], //contains all markers
|
37
|
-
|
38
|
-
polygons:
|
39
|
-
|
40
|
-
|
41
|
-
polyline_objects: [], //contains processed google.maps.Polyline
|
42
|
-
circles: null, //contains raw data, array of hash
|
43
|
-
circle_objects: [], //contains processed google.maps.Circle
|
44
|
-
info_window : null,
|
37
|
+
markers : [], //contains all markers. A marker contains the following: {"description": , "longitude": , "title":, "latitude":, "picture": "", "width": "", "length": "", "sidebar": "", "google_object": google_marker}
|
38
|
+
bounds_object: null, //contains current bounds from markers, polylines etc...
|
39
|
+
polygons: [], //contains raw data, array of arrays (first element could be a hash containing options)
|
40
|
+
polylines: [], //contains raw data, array of arrays (first element could be a hash containing options)
|
41
|
+
circles: [], //contains raw data, array of hash
|
45
42
|
markerClusterer: null, //contains all marker clusterers
|
46
43
|
|
47
44
|
//Polygon Styling
|
@@ -92,15 +89,11 @@ var Gmaps4Rails = {
|
|
92
89
|
center: new google.maps.LatLng(this.map_options.center_latitude, this.map_options.center_longitude),
|
93
90
|
mapTypeId: google.maps.MapTypeId[this.map_options.type]
|
94
91
|
});
|
95
|
-
//
|
96
|
-
|
97
|
-
|
98
|
-
});
|
99
|
-
//variable used for Auto-adjust
|
100
|
-
this.bounds = new google.maps.LatLngBounds();
|
101
|
-
|
92
|
+
//resets sidebar if needed
|
93
|
+
this.reset_sidebar_content();
|
94
|
+
//launch callbacks if any
|
102
95
|
if(typeof gmaps4rails_callback == 'function') {
|
103
|
-
|
96
|
+
gmaps4rails_callback();
|
104
97
|
}
|
105
98
|
},
|
106
99
|
|
@@ -150,7 +143,6 @@ var Gmaps4Rails = {
|
|
150
143
|
if (this.exists(this.circles[i].latitude) && this.exists(this.circles[i].longitude))
|
151
144
|
{
|
152
145
|
center = new google.maps.LatLng(this.circles[i].latitude, this.circles[i].longitude);
|
153
|
-
this.extend_bounds(center);
|
154
146
|
//always check if a config is given, if not, use defaults
|
155
147
|
var circle = new google.maps.Circle({
|
156
148
|
center: center,
|
@@ -162,7 +154,7 @@ var Gmaps4Rails = {
|
|
162
154
|
radius: this.circles[i].radius,
|
163
155
|
clickable: false
|
164
156
|
});
|
165
|
-
this.
|
157
|
+
this.circles[i].google_object = circle;
|
166
158
|
circle.setMap(this.map);
|
167
159
|
}
|
168
160
|
}
|
@@ -171,23 +163,7 @@ var Gmaps4Rails = {
|
|
171
163
|
//polygons is an array of arrays. It loops.
|
172
164
|
create_polygons: function(){
|
173
165
|
for (var i = 0; i < this.polygons.length; ++i) {
|
174
|
-
|
175
|
-
if (i==0)
|
176
|
-
{
|
177
|
-
//Array contain polygon elements
|
178
|
-
if (this.polygons[i] instanceof Array) {
|
179
|
-
this.create_polygon(i);
|
180
|
-
}
|
181
|
-
//hashes contain configuration which would be set as default
|
182
|
-
else{
|
183
|
-
if (this.exists(this.polygons[i].strokeColor) ) { this.polygons_conf.strokeColor = this.polygons[i].strokeColor; }
|
184
|
-
if (this.exists(this.polygons[i].strokeOpacity)) { this.polygons_conf.strokeOpacity = this.polygons[i].strokeOpacity; }
|
185
|
-
if (this.exists(this.polygons[i].strokeWeight )) { this.polygons_conf.strokeWeight = this.polygons[i].strokeWeight; }
|
186
|
-
if (this.exists(this.polygons[i].fillColor )) { this.polygons_conf.fillColor = this.polygons[i].fillColor; }
|
187
|
-
if (this.exists(this.polygons[i].fillOpacity )) { this.polygons_conf.fillOpacity = this.polygons[i].fillOpacity; }
|
188
|
-
}
|
189
|
-
}
|
190
|
-
else { this.create_polygon(i); }
|
166
|
+
this.create_polygon(i)
|
191
167
|
}
|
192
168
|
},
|
193
169
|
|
@@ -203,7 +179,6 @@ var Gmaps4Rails = {
|
|
203
179
|
for (var j = 0; j < this.polygons[i].length; ++j) {
|
204
180
|
var latlng = new google.maps.LatLng(this.polygons[i][j].latitude, this.polygons[i][j].longitude);
|
205
181
|
polygon_coordinates.push(latlng);
|
206
|
-
this.extend_bounds(latlng);
|
207
182
|
//first element of an Array could contain specific configuration for this particular polygon. If no config given, use default
|
208
183
|
if (j==0) {
|
209
184
|
strokeColor = this.polygons[i][j].strokeColor || this.polygons_conf.strokeColor;
|
@@ -225,28 +200,14 @@ var Gmaps4Rails = {
|
|
225
200
|
clickable: false
|
226
201
|
});
|
227
202
|
//save polygon in list
|
228
|
-
this.
|
203
|
+
this.polygons[i].google_object = new_poly;
|
229
204
|
new_poly.setMap(this.map);
|
230
205
|
},
|
231
206
|
|
232
207
|
//polylines is an array of arrays. It loops.
|
233
208
|
create_polylines: function(){
|
234
209
|
for (var i = 0; i < this.polylines.length; ++i) {
|
235
|
-
|
236
|
-
if (i==0)
|
237
|
-
{
|
238
|
-
//Array contain polyline elements
|
239
|
-
if (this.polylines[i] instanceof Array) {
|
240
|
-
this.create_polyline(i);
|
241
|
-
}
|
242
|
-
//hashes contain configuration which would be set as default
|
243
|
-
else{
|
244
|
-
if (this.exists(this.polylines[i].strokeColor) ) { this.polylines_conf.line_strokeColor = this.polygons[i].strokeColor; }
|
245
|
-
if (this.exists(this.polylines[i].strokeOpacity) ) { this.polylines_conf.line_strokeOpacity = this.polygons[i].strokeOpacity;}
|
246
|
-
if (this.exists(this.polylines[i].strokeWeight) ) { this.polylines_conf.line_strokeWeight = this.polygons[i].strokeWeight; }
|
247
|
-
}
|
248
|
-
}
|
249
|
-
else { this.create_polyline(i); }
|
210
|
+
this.create_polyline(i);
|
250
211
|
}
|
251
212
|
},
|
252
213
|
|
@@ -265,7 +226,6 @@ var Gmaps4Rails = {
|
|
265
226
|
//loop through every point in the array
|
266
227
|
for (var k = 0; k < decoded_array.length; ++k) {
|
267
228
|
polyline_coordinates.push(decoded_array[k]);
|
268
|
-
this.extend_bounds(decoded_array[k]);
|
269
229
|
polyline_coordinates.push(decoded_array[k]);
|
270
230
|
}
|
271
231
|
}
|
@@ -282,7 +242,6 @@ var Gmaps4Rails = {
|
|
282
242
|
{
|
283
243
|
var latlng = new google.maps.LatLng(this.polylines[i][j].latitude, this.polylines[i][j].longitude);
|
284
244
|
polyline_coordinates.push(latlng);
|
285
|
-
this.extend_bounds(latlng);
|
286
245
|
}
|
287
246
|
}
|
288
247
|
}
|
@@ -295,17 +254,9 @@ var Gmaps4Rails = {
|
|
295
254
|
clickable: false
|
296
255
|
});
|
297
256
|
//save polyline
|
298
|
-
this.
|
257
|
+
this.polylines[i].google_object = new_poly;
|
299
258
|
new_poly.setMap(this.map);
|
300
259
|
},
|
301
|
-
|
302
|
-
//Two options:
|
303
|
-
// 1- processing == "rails_model" && builder = model_name
|
304
|
-
// 2- processing == "json" && builder = json in format: [{"description": , "longitude": , "title":, "latitude":, "picture": "", "width": "", "length": ""}]
|
305
|
-
create_markers: function() {
|
306
|
-
this.setup_Markers();
|
307
|
-
this.adjust();
|
308
|
-
},
|
309
260
|
|
310
261
|
// clear markers
|
311
262
|
clear_markers: function(){
|
@@ -321,16 +272,20 @@ var Gmaps4Rails = {
|
|
321
272
|
replace_markers: function(new_markers){
|
322
273
|
//reset previous markers
|
323
274
|
this.markers = new Array;
|
324
|
-
//reset
|
325
|
-
this.
|
275
|
+
//reset current bounds
|
276
|
+
this.google_bounds = new google.maps.LatLngBounds();
|
326
277
|
//reset sidebar content if exists
|
278
|
+
this.reset_sidebar_content();
|
279
|
+
//add new markers
|
280
|
+
this.add_markers(new_markers);
|
281
|
+
},
|
282
|
+
|
283
|
+
reset_sidebar_content: function(){
|
327
284
|
if (this.markers_conf.list_container != null ){
|
328
285
|
var ul = document.getElementById(this.markers_conf.list_container);
|
329
286
|
ul.innerHTML = "";
|
330
287
|
}
|
331
|
-
|
332
|
-
this.add_markers(new_markers);
|
333
|
-
},
|
288
|
+
},
|
334
289
|
|
335
290
|
//add new markers to on an existing map (beware, it doesn't check duplicates)
|
336
291
|
add_markers: function(new_markers){
|
@@ -339,15 +294,19 @@ var Gmaps4Rails = {
|
|
339
294
|
//update the list of markers to take into account
|
340
295
|
this.markers = this.markers.concat(new_markers);
|
341
296
|
//put markers on the map
|
342
|
-
this.
|
343
|
-
//adjust map
|
344
|
-
this.adjust();
|
297
|
+
this.create_markers();
|
345
298
|
},
|
346
299
|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
300
|
+
//creates, clusterizes and adjusts map
|
301
|
+
create_markers: function() {
|
302
|
+
this.create_google_markers_from_markers();
|
303
|
+
this.clusterize();
|
304
|
+
this.adjust_map_to_bounds();
|
305
|
+
},
|
306
|
+
|
307
|
+
//create google.maps Markers from data provided by user
|
308
|
+
create_google_markers_from_markers: function(){
|
309
|
+
for (var i = 0; i < this.markers.length; ++i) {
|
351
310
|
//check if the marker has not already been created
|
352
311
|
if (!this.exists(this.markers[i].google_object)) {
|
353
312
|
//test if value passed or use default
|
@@ -367,7 +326,6 @@ var Gmaps4Rails = {
|
|
367
326
|
}
|
368
327
|
|
369
328
|
var myLatLng = new google.maps.LatLng(Lat, Lng);
|
370
|
-
this.extend_bounds(myLatLng);
|
371
329
|
|
372
330
|
// Marker sizes are expressed as a Size of X,Y
|
373
331
|
if (marker_picture == "")
|
@@ -379,18 +337,26 @@ var Gmaps4Rails = {
|
|
379
337
|
}
|
380
338
|
//save object
|
381
339
|
this.markers[i].google_object = ThisMarker;
|
382
|
-
//add infowindowstuff
|
383
|
-
this.
|
340
|
+
//add infowindowstuff if enabled
|
341
|
+
this.create_info_window(this.markers[i]);
|
342
|
+
//create sidebar if enabled
|
343
|
+
this.create_sidebar(this.markers[i]);
|
384
344
|
}
|
385
345
|
}
|
386
|
-
|
346
|
+
|
387
347
|
},
|
388
348
|
|
389
|
-
|
349
|
+
// creates infowindows
|
350
|
+
create_info_window: function(marker_container){
|
390
351
|
//create the infowindow
|
391
352
|
var info_window = new google.maps.InfoWindow({content: marker_container.description });
|
392
353
|
//add the listener associated
|
393
354
|
google.maps.event.addListener(marker_container.google_object, 'click', this.openInfoWindow(info_window, marker_container.google_object));
|
355
|
+
|
356
|
+
},
|
357
|
+
|
358
|
+
//creates sidebar
|
359
|
+
create_sidebar: function(marker_container){
|
394
360
|
if (this.markers_conf.list_container)
|
395
361
|
{
|
396
362
|
var ul = document.getElementById(this.markers_conf.list_container);
|
@@ -399,11 +365,19 @@ var Gmaps4Rails = {
|
|
399
365
|
aSel.href = 'javascript:void(0);';
|
400
366
|
var html = this.exists(marker_container.sidebar) ? marker_container.sidebar : "Marker";
|
401
367
|
aSel.innerHTML = html;
|
402
|
-
aSel.onclick = this.
|
368
|
+
aSel.onclick = this.sidebar_element_handler(marker_container.google_object, 'click');
|
403
369
|
li.appendChild(aSel);
|
404
370
|
ul.appendChild(li);
|
405
371
|
}
|
406
372
|
},
|
373
|
+
|
374
|
+
//moves map to marker clicked + open infowindow
|
375
|
+
sidebar_element_handler: function(marker, eventType) {
|
376
|
+
return function() {
|
377
|
+
Gmaps4Rails.map.panTo(marker.position);
|
378
|
+
google.maps.event.trigger(marker, eventType);
|
379
|
+
};
|
380
|
+
},
|
407
381
|
|
408
382
|
openInfoWindow: function(infoWindow, marker) {
|
409
383
|
return function() {
|
@@ -417,14 +391,8 @@ var Gmaps4Rails = {
|
|
417
391
|
};
|
418
392
|
},
|
419
393
|
|
420
|
-
|
421
|
-
|
422
|
-
Gmaps4Rails.map.panTo(marker.position);
|
423
|
-
google.maps.event.trigger(marker, eventType);
|
424
|
-
};
|
425
|
-
},
|
426
|
-
|
427
|
-
setup_Clusterer: function()
|
394
|
+
//creates clusters
|
395
|
+
clusterize: function()
|
428
396
|
{
|
429
397
|
if (this.markers_conf.do_clustering == true)
|
430
398
|
{
|
@@ -442,11 +410,55 @@ var Gmaps4Rails = {
|
|
442
410
|
},
|
443
411
|
|
444
412
|
//to make the map fit the different LatLng points
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
413
|
+
adjust_map_to_bounds: function(latlng) {
|
414
|
+
|
415
|
+
//FIRST_STEP: retrieve all bounds
|
416
|
+
//create the bounds object only if necessary
|
417
|
+
if (this.map_options.auto_adjust || this.map_options.bounds != null) {
|
418
|
+
this.google_bounds = new google.maps.LatLngBounds();
|
419
|
+
}
|
420
|
+
|
421
|
+
//if autodjust is true, must get bounds from markers polylines etc...
|
422
|
+
if (this.map_options.auto_adjust) {
|
423
|
+
//from markers
|
424
|
+
for (var i = 0; i < this.markers.length; ++i) {
|
425
|
+
this.google_bounds.extend(this.markers[i].google_object.position);
|
426
|
+
}
|
427
|
+
//from polygons:
|
428
|
+
for (var i = 0; i < this.polylines.length; ++i) {
|
429
|
+
this.polylines[i].google_object.latLngs.forEach(function(obj1){ obj1.forEach(function(obj2){ Gmaps4Rails.google_bounds.extend(obj2);} );})
|
430
|
+
}
|
431
|
+
//from polylines:
|
432
|
+
for (var i = 0; i < this.polygons.length; ++i) {
|
433
|
+
this.polygons[i].google_object.latLngs.forEach(function(obj1){ obj1.forEach(function(obj2){ Gmaps4Rails.google_bounds.extend(obj2);} );})
|
434
|
+
}
|
435
|
+
//from circles
|
436
|
+
for (var i = 0; i < this.circles.length; ++i) {
|
437
|
+
this.google_bounds.extend(this.circles[i].google_object.getBounds().getNorthEast());
|
438
|
+
this.google_bounds.extend(this.circles[i].google_object.getBounds().getSouthWest());
|
439
|
+
}
|
440
|
+
}
|
441
|
+
//in every case, I've to take into account the bounds set up by the user
|
442
|
+
for (var i = 0; i < this.map_options.bounds.length; ++i) {
|
443
|
+
//create points from bounds provided
|
444
|
+
var bound = new google.maps.LatLng(this.map_options.bounds[i].lat, this.map_options.bounds[i].lng);
|
445
|
+
this.google_bounds.extend(bound);
|
446
|
+
}
|
447
|
+
|
448
|
+
//SECOND_STEP: ajust the map to the bounds
|
449
|
+
if (this.map_options.auto_adjust || this.map_options.bounds.length > 0) {
|
450
|
+
|
451
|
+
//if autozoom is false, take user info into account
|
452
|
+
if(!this.map_options.auto_zoom) {
|
453
|
+
var map_center = this.google_bounds.getCenter();
|
454
|
+
this.map_options.center_longitude = map_center.lat();
|
455
|
+
this.map_options.center_latitude = map_center.lng();
|
456
|
+
this.map.setCenter(map_center);
|
457
|
+
}
|
458
|
+
else {
|
459
|
+
this.map.fitBounds(this.google_bounds);
|
460
|
+
}
|
461
|
+
}
|
450
462
|
},
|
451
463
|
|
452
464
|
//basic function to check existence of a variable
|
@@ -464,32 +476,7 @@ var Gmaps4Rails = {
|
|
464
476
|
return [Lat, Lng];
|
465
477
|
},
|
466
478
|
|
467
|
-
//
|
468
|
-
adjust: function(){
|
469
|
-
if (this.map_options.auto_adjust) {
|
470
|
-
if(this.map_options.auto_zoom) {
|
471
|
-
this.map.fitBounds(this.bounds);
|
472
|
-
}
|
473
|
-
else {
|
474
|
-
var map_center = this.bounds.getCenter();
|
475
|
-
this.map_options.center_longitude = map_center.Da;
|
476
|
-
this.map_options.center_latitude = map_center.Ba;
|
477
|
-
this.map.setCenter(map_center);
|
478
|
-
}
|
479
|
-
}
|
480
|
-
},
|
481
|
-
|
482
|
-
//retrives a value between -1 and 1
|
479
|
+
//gives a value between -1 and 1
|
483
480
|
random: function() { return ( Math.random() * 2 -1); }
|
484
481
|
|
485
|
-
};
|
486
|
-
|
487
|
-
//marker_clusterer styles
|
488
|
-
// var styles = [{
|
489
|
-
// url: 'http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/1.0/images/people35.png',
|
490
|
-
// height: 35,
|
491
|
-
// width: 35,
|
492
|
-
// opt_anchor: [16, 0],
|
493
|
-
// opt_textColor: '#ff00ff',
|
494
|
-
// opt_textSize: 10
|
495
|
-
// }];
|
482
|
+
};
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class User < ActiveRecord::Base
|
2
2
|
acts_as_gmappable
|
3
|
-
|
3
|
+
|
4
4
|
def gmaps4rails_address
|
5
5
|
address
|
6
6
|
end
|
@@ -10,6 +10,7 @@ class User < ActiveRecord::Base
|
|
10
10
|
# end
|
11
11
|
#
|
12
12
|
def gmaps4rails_infowindow
|
13
|
-
"je suis l'infowindow"
|
13
|
+
"je suis l'infowindow de #{name}"
|
14
14
|
end
|
15
|
+
|
15
16
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe "Geocode" do
|
4
4
|
|
5
5
|
it "should geocode properly an address" do
|
6
|
-
Gmaps4rails.geocode("alaska").should == [{:
|
6
|
+
Gmaps4rails.geocode("alaska").should == [{:matched_address=>"Alaska, USA", :bounds=>{"northeast"=>{"lng"=>-129.979511, "lat"=>71.441059}, "southwest"=>{"lng"=>172.347846, "lat"=>51.175092}}, :lat=>63.588753, :lng=>-154.4930619}]
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should raise an error when address invalid" do
|
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:
|
4
|
+
hash: 9
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
9
|
+
- 5
|
10
|
+
version: 0.7.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Benjamin Roth
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-04-
|
19
|
+
date: 2011-04-09 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|