1

我正在做一个项目,我想在地图上显示标记。

这些标记应该从具有视口约束的服务器发布。这意味着只发布当前用户视口内的标记。

该出版物看起来像这样:

//server
Meteor.publish('posts', function(bottom_left_x, bottom_left_y, upper_right_x, upper_right_y, limit) {

  return Posts.find({locs: {$geoWithin: {$box:
                                  [[bottom_left_x, bottom_left_y],
                                   [upper_right_x, upper_right_y]]}}},
                       {sort: {submitted: -1}, limit: limit});
});

当我的 map_center 更改时,我总是通过订阅调用此函数:

//client
google.maps.event.addListener(map, 'idle', function(event) {
  var bounds = map.getBounds();

  var ne = bounds.getNorthEast();
  var sw = bounds.getSouthWest();
  postsHandle= Meteor.subscribe('posts', sw.lat(), sw.lng(), ne.lat(), ne.lng(), 10);
});

到目前为止,一切正常。此外,我在帖子上创建了一个观察函数,它在调用“添加”时呈现一个标记,并在调用“移除”时呈现一个标记。观察对于渲染新标记和破坏旧标记非常好

//client
Posts.find().observeChanges({
  added: function(post) {
  // when 'added' callback fires, add HTML element
    var marker = new google.maps.Marker({
      position: new google.maps.LatLng(post.locs.lat, post.locs.lng),
      postId: post._id,
      map: map,
    });
},removed .... and so on

这个问题是在整个 Posts-Collection 上触发了观察回调。但我只想显示用户视口内的标记。这就是为什么我通常必须做这样的事情:

//client
Posts.find({locs: {$geoWithin: {$box:
                                  [[bottom_left_x, bottom_left_y],
                                   [upper_right_x, upper_right_y]]}}},
                       {sort: {submitted: -1}, limit: limit}).observeChanges({

但那是不可能的。minimongo 内部不支持 GeoWithin,并且无法使用具有限制的集合调用 oberserve。

有谁知道如何做到这一点?也许有一种方法可以将我从订阅中获得的帖子直接推送到地图而不使用 minimongo 上的查询?

4

1 回答 1

1

解决办法就是这么简单!

Meteor.autosubscribe( function () {
  Meteor.subscribe( 'chat', { room: Session.get( 'currentRoom' ) } );
} );

如果您想通过更改视口边界来限制对地图视口的订阅,则必须使用自动订阅。似乎自动订阅负责更改订阅参数:)

Meteor.autosubscribe( function () {
  var a = Session.get('bounds');
  if(a)
    Meteor.subscribe( 'posts', a.swlat, a.swlng, a.nelat, a.nelng, 5 );
} );
于 2013-09-01T14:26:51.870 回答