我正在整理一个移动流星应用程序,我想用它来列出本地(比如半径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设置为一个巨大的数字,或直接搜索已存储的一组坐标。
我做错了什么?
答案 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
( - :