Show Markers on Google Maps Dynamically - Rails 3.2

I have a working code that shows several markers on a Google map using geocoder , for example @nearbys = Place.near("#{params[:address]}", 5,:order => "distance",:units => :km) @nearbys.first(5) and I display markers using the code below

 function initialize() { var map; var bounds = new google.maps.LatLngBounds(); var mapOptions = { mapTypeId: 'roadmap' }; // Display a map on the page map = new google.maps.Map(document.getElementById("map-canvas-guest"), mapOptions); map.setTilt(45); // adding Multiple Markers from ruby object var markers = [ ['<%= @nearbys[0].title %>', '<%= @nearbys[0].latitude %>','<%= @nearbys[0].longitude %>'], ['<%= @nearbys[1].title %>', '<%= @nearbys[1].latitude %>','<%= @nearbys[1].longitude %>'], ['<%= @nearbys[2].title %>', '<%= @nearbys[2].latitude %>','<%= @nearbys[2].longitude %>'], ['<%= @nearbys[3].title %>', '<%= @nearbys[3].latitude %>','<%= @nearbys[3].longitude %>'] , ['<%= @nearbys[4].title %>', '<%= @nearbys[4].latitude %>','<%= @nearbys[4].longitude %>'] ]; // adding Info Window Content var infoWindowContent = [ ['<div class="info_content" >' + '<h3><%= @nearbys[0].title %></h3>' +'</br>'+ '<p><%= @nearbys[0].about %></p>' + '</div>'], ['<div class="info_content">' + '<h3><%= @nearbys[1].title %></h3>' + '<p><%= @nearbys[1].about %></p>' + '</div>'], ['<div class="info_content">' + '<h3><%= @nearbys[2].title %></h3>' +'</br>'+ '<p><%= @nearbys[2].about %></p>' + '</div>'], ['<div class="info_content">' + '<h3><%= @nearbys[3].title %></h3>' +'</br>'+ '<p><%= @nearbys[2].about %>/p>' + '</div>'], ['<div class="info_content">' + '<h3><%= @nearbys[4].title %></h3>' +'</br>'+ '<p><%= @nearbys[4].about %></p>' + '</div>'] ]; // Display multiple markers on a map var infoWindow = new google.maps.InfoWindow(), marker, i; // Loop through our array of markers & place each one on the map for( i = 0; i < markers.length; i++ ) { var position = new google.maps.LatLng(markers[i][1], markers[i][2]); bounds.extend(position); marker = new google.maps.Marker({ position: position, map: map, title: markers[i][0] }); // Allow each marker to have an info window google.maps.event.addListener(marker, 'click', (function(marker, i) { return function() { infoWindow.setContent(infoWindowContent[i][0]); infoWindow.open(map, marker); } })(marker, i)); // Automatically center the map fitting all markers on the screen map.fitBounds(bounds); } // Override our map zoom level once our fitBounds function runs (Make sure it only runs once) var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) { this.setZoom(14); google.maps.event.removeListener(boundsListener); }); }//initialize ends 

BUT the problem: -that if @nearbys has less than 5, then this code does not work. SO I tried to make it dynamic using jquery arrays, but it does not work, because I think that there is something missing in my code to work this dynamically. it should be something like this.

 var array=<%= @nearbys%>; var markers=[]; var infowindows=[]; array.each(function(index){ markers.push('<%= @nearbys[0].title %>', '<%= @nearbys[0].latitude %>','<%= @nearbys[0].longitude %>'); infowindows.push('<div class="info_content" >'+'<h3><%= @nearbys[0].title %></h3>' +'</br>'+ '<p><%= @nearbys[0].about %></p>'+'</div>'); }) 

.. SO, how can I achieve this ........ to make this dynamic so that the above working code does not break with newly added code.

0
source share
2 answers

after the battle with jquery arrays and json , I was able to find this best solution ... it works in all scenarios, and all I need is to handle the empty and null conditions that I have already done, and its working the way I do was needed. THIS IS HELPED BY ANYONE

my controller

 def show_nearby_locations @nearbys = Place.near("#{params[:address]}", 5,:order => "distance",:units => :km) @nearbys.first(10) end 

in my view file

 <%= javascript_tag do%> window.nearbys= <%=raw @nearbys.to_json %>; <%end%> 

this is my script internal view

 function initialize() { var map; var bounds = new google.maps.LatLngBounds(); var mapOptions = { mapTypeId: 'roadmap' }; // Display a map on the page map = new google.maps.Map(document.getElementById("map-canvas-guest"), mapOptions); map.setTilt(45); var markers=[]; var infoWindowContent=[]; $.each(nearbys, function(index) { console.log( data[0][index].latitude,data[0][index].longitude ); markers.push([nearbys[index]['title'], nearbys[index]['latitude'],nearbys[index]['longitude']]); infoWindowContent.push(['<div class="info_content" >' + '<h3 style="color: rgb(<%= rand(0..200)%>,<%= rand(0..200)%> ,<%= rand(0..200)%>);">'+nearbys[index]['title']+'</h3>' +'</br>'+ '<p>'+nearbys[index]['about']+'</p>' + '</div>']); }); // Display multiple markers on a map var infoWindow = new google.maps.InfoWindow(), marker, i; // Loop through our array of markers & place each one on the map for( i = 0; i < markers.length; i++ ) { var position = new google.maps.LatLng(markers[i][1], markers[i][2]); bounds.extend(position); marker = new google.maps.Marker({ position: position, map: map, title: markers[i][0] }); // Allow each marker to have an info window google.maps.event.addListener(marker, 'click', (function(marker, i) { return function() { infoWindow.setContent(infoWindowContent[i][0]); infoWindow.open(map, marker); } })(marker, i)); // Automatically center the map fitting all markers on the screen map.fitBounds(bounds); } // Override our map zoom level once our fitBounds function runs (Make sure it only runs once) var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) { this.setZoom(14); google.maps.event.removeListener(boundsListener); }); }//initialize ends 
+3
source

Hi friends, doing with Google Maps. With Rails, I searched for information from google maps and Gmaps4rails, I made some markers and info windows, this is the code

My controller

  @users = User.all @hash = Gmaps4rails.build_markers(@users) do |user, marker| marker.lat user.latitude marker.lng user.longitude marker.infowindow user.title` end 

In my view

 window.onload = function () { var markers = <%=raw @hash.to_json %>; var mapOptions = { center: new google.maps.LatLng(markers[0].lat, markers[0].lng), zoom: 15, mapTypeId: google.maps.MapTypeId.ROADMAP }; var infoWindow = new google.maps.InfoWindow(); var map = new google.maps.Map(document.getElementById("map"), mapOptions); for (i = 0; i < markers.length; i++) { var data = markers[i] var myLatlng = new google.maps.LatLng(data.lat, data.lng); marker = new google.maps.Marker({ position: myLatlng, map: map, title: data.title }); (function (marker, data) { google.maps.event.addListener(marker, "click", function (e) { infoWindow.setContent(data.description); infoWindow.open(map, marker); }); })(marker, data); } } 
0
source

Source: https://habr.com/ru/post/1202333/


All Articles