在Google地图上动态显示标记-Rails 3.2
我有一个工作代码,使用geocoder
器在谷歌地图上显示多个标记,例如@nearbys = Place.near("#{params[:address]}", 5,:order => "distance",:units => :km) @nearbys.first(5)
并使用以下代码显示标记
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 = [ ['', '',''], ['', '',''], ['', '',''], ['', '',''] , ['', '',''] ]; // adding Info Window Content var infoWindowContent = [ ['' + '' +''+ '' + ''], ['' + '' + '' + ''], ['' + '' +''+ '' + ''], ['' + '' +''+ '/p>' + '
'], ['' + '' +''+ '' + ''] ]; // 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
但问题是: – 如果@nearbys少于5个计数,那么这个代码就失败了。我一直试图使用jquery数组使其动态,但它不起作用,因为我认为我的代码缺少动态工作的东西。 它应该是这样的..
var array=; var markers=[]; var infowindows=[]; array.each(function(index){ markers.push('', '',''); infowindows.push(''+'' +''+ ''+''); })
..SO我怎么能实现这个……..使这个动态,以便上面的工作代码不会破坏新添加的代码。
在与jquery arrays
和json
斗争之后,我能够找到这个最佳解决方案…这在所有场景中都有效,我需要的是处理空和空条件,我已经做了它并且按照我需要的方式工作。希望这有助于某人
我的控制器
def show_nearby_locations @nearbys = Place.near("#{params[:address]}", 5,:order => "distance",:units => :km) @nearbys.first(10) end
在我的视图文件中
<%= javascript_tag do%> window.nearbys= <%=raw @nearbys.to_json %>; <%end%>
这是我的脚本里面的视图
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(['' + ''+nearbys[index]['title']+'
' +''+ ''+nearbys[index]['about']+'
' + '']); }); // 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
你好朋友通过谷歌地图使用Rails我已经搜索了谷歌地图网站和Gmaps4rails的信息我已经做了多个标记和信息窗口她是代码
我的控制器
@users = User.all @hash = Gmaps4rails.build_markers(@users) do |user, marker| marker.lat user.latitude marker.lng user.longitude marker.infowindow user.title` end
在我看来
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); } }