使用Pusher在地图上添加标记?

时间:2011-09-05 07:08:07

标签: ruby-on-rails-3 google-maps push-notification

我正在创建一个地图,根据我网站上的人的IP显示。我想的是一张很酷的地图,显示了全球所有正在击中地图的地方。但我遇到了一个小问题。我正在跟踪ip,然后从他们处理Geo查询,最后我使用pusherapp将数据发布到地图上。但是,现在我可以通过在我的网站上附加数据来制作无序列表,但我无法弄清楚如何将其添加到我的谷歌地图中,​​也不能将该地图重绘为数据。有人可以帮我吗? 所以基本上在服务器端:

var bounds = new google.maps.LatLngBounds();
var latlng = new google.maps.LatLng( #{@a.lat}, #{@a.lng});

    var marker = new google.maps.Marker({
      animation: google.maps.Animation.DROP,
      icon: 'images/marker.png',
      map: map,
      position: latlng,
      title: 'Here'
    });

    bounds.extend(latlng);
    map.fitBounds(bounds);

然后是客户端:

channel.bind('latitude', function(data){
 $('#list').append(data);
});  

但即使我确实让它进入脚本部分,谷歌地图会知道如何更新? 我真的希望将这一切保留在Rails中,而对于我现在正在使用pusher的服务 谢谢!

1 个答案:

答案 0 :(得分:2)

感谢您使用我们的服务。

听到它的声音,您应该使用我们的presence functionality,这样您就可以跟踪用户离开和加入您的网站。

部分呈现功能是当用户订阅某个频道时,会对您的服务器进行AJAX调用。在该调用中,您可以进行IP查找,然后将该查找的详细信息(我建议只使用lat和long值)作为user_info返回到状态请求。有关详细信息,请参阅Authenticating Users。这些文档还提供了一个Rails示例,用于对用户进行身份验证并为该用户提供user_info

当任何用户订阅客户端中的状态频道时,他们将获得initial list of connected users。您可以遍历该用户列表并获取每个用户的信息,并将标记添加到Google地图。当新用户加入时,您将在频道上获得member_added events,并且您可以添加新标记。当用户离开时,您将获得member_removed event,并且您可以删除标记。

客户端代码的示例可能是:

var channel = pusher.subscribe('presence-site-map-channel');

// Initial list of users on the site
channel.bind('pusher:subscription_succeeded', function(members) {
  members.each(function(member) {
    addMember(member);
  });
});
channel.bind('pusher:member_added, addMember);
channel.bind('pusher:member_removed, function() { /* TODO: implement */});

function addMember(member) {
  var bounds = new google.maps.LatLngBounds();
  var latlng = new google.maps.LatLng( member.info.lat, member.info.long);

  var marker = new google.maps.Marker({
    animation: google.maps.Animation.DROP,
    icon: 'images/marker.png',
    map: map,
    position: latlng,
    title: member.info.id // each user must have a unique ID and you could use it here
  });

  bounds.extend(latlng);
  map.fitBounds(bounds);
};