移动流星应用程序 - 计算附近的位置并存储为可排序的集合

时间:2014-05-06 09:00:23

标签: mongodb meteor geo

我正在整理一个移动流星应用程序,我想用它来列出本地(比如半径20英里范围内)的便利设施。我有这些设施的集合以及相应的latlng数据 - 我希望能够将应用程序传递给当前位置(使用Cordova)并生成最先排序的列表(/ collection?)。

我有两个具体的问题,我真的很感激你的建议!

我可以使用mongo的$near,还是应该使用node.js附加组件(例如'GeoLib' - https://github.com/manuelbieh/geolib)进行距离计算?

如何生成这些位置的临时(本地存储)集合以显示在我的列表中?据推测,如果我不使用$near,我必须遍历我的位置,计算所有这些位置的距离,然后返回任何距离低于某个阈值的地方,但这似乎是一种昂贵的方式当我的位置列表增长和增长时。

对不起,这是我第一次尝试这样的事情;我非常感谢来自经验丰富的开发人员的任何建议!

编辑 - 我的代码(为什么不工作?!)

我将这样的位置存储在一个集合中:

Beaches.insert({ name: 'Venice Beach CA', geometry: { type: "Point", coordinates: [-118.473314,118.473314] } });

...

Beaches._ensureIndex({'geometry.coordinates':'2d'}, function(err, result) { if(err) return console.dir(err); });

我正在查询这些条目(传递lat和lng):

getNearBeaches = function(lng,lat) { return Beaches.find({'geometry.coordinates': { $near: { $geometry: { type: "Point", coordinates: [lng,lat] } }, $maxDistance: 20000 //meters } }) };

我可以用直线find()列出我的收藏品,但我的位置搜索没有返回任何内容,即使我将$ maxDistance设置为一个巨大的数字,或直接搜索已存储的一组坐标。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

您可以获取当前位置,将其发送到服务器并订阅收藏,并通过mongodb $near进行过滤:

Meteor.subscribe("amenities", {latlng: Session.get("latlng")});

并且像这样:

Meteor.publish("amenities", function (latlng) {
   return Amenities.find({
      location: {
        $near: {
          $geometry: {
            type: "Point",
            coordinates: latlng
          },
          $maxDistance: 20000   //meters
        }
      }
    });
});

您必须拥有正确的数据类型和索引。和字段location( - :