我正在组合一个移动 meteor 应用程序,我想用它来列出本地(比如 20 英里半径范围内)的便利设施。我收集了这些设施和相应的 latlng 数据——我希望能够将应用程序传递给我当前的位置(使用 Cordova)并生成一个排序最接近的列表(/collection?)。
我有两个具体问题,非常感谢您的建议!
我可以为此使用 mongo 的 $near
还是应该使用 node.js 插件(例如 'GeoLib' - https://github.com/manuelbieh/geolib )来进行距离计算?
如何生成这些位置的临时(本地存储)集合以显示在我的列表中?大概如果我不使用 $near
我必须遍历我的位置,计算所有位置的距离,然后返回距离低于某个阈值的任何位置,但这似乎很昂贵当我的位置列表越来越多时,这样做的方法。
对不起,这是我第一次尝试这样的事情;非常感谢经验丰富的开发人员提供的任何建议!
编辑 - 我的代码(为什么它不起作用?!)
我将这样的位置存储在一个集合中:
Beaches.insert({
名称:'威尼斯海滩 CA',
几何学: {
类型:“点”,
坐标:[-118.473314,118.473314]
}
});
...
Beaches._ensureIndex({'geometry.coordinates':'2d'}, function(err, result) {
如果(错误)返回控制台.dir(错误);
});
我正在像这样查询这些条目(传入 lat 和 lng):
getNearBeaches = function(lng,lat) {
返回 Beaches.find({'geometry.coordinates':
{
$近:{
$几何:{
类型:“点”,
坐标:[lng,lat]
}
},
$maxDistance: 20000//米
}
})
};
我可以直接使用 find()
列出我的收藏,但我的位置搜索没有返回任何内容,即使我将 $maxDistance 设置为一个巨大的数字,或者直接搜索已经存储的一组坐标.
我做错了什么??
最佳答案
您可以获取当前位置,将其发送到服务器并订阅集合,由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
(-:
关于mongodb - 移动 meteor 应用程序 - 计算附近的位置并存储为可分类的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490264/