我正在处理一个应用程序,该应用程序将显示距其位置一定距离的人员帖子。
每当创建一个帖子时,就会创建一个位置值,该值存储在:{" lat":39.7230949," lng": - 104.83521619999999}。制作帖子时当前位置的纬度和经度。
这是一个函数Geolocation.latLng();,它使用当前设备的lat和lng打印出对象。
我现在正试图弄清楚如何设置列出所有帖子的页面,只显示落在设备当前位置半径范围内的帖子。
这是我当前的函数,它列出了我数据库中的所有帖子。
Template.yakResults.searchResults = function () {
var keyword = Session.get("search-query");
var query = new RegExp( keyword, 'i' );
var results = Yaks.find( { $or: [{'yak': query}] }, {sort: {score: -1}});
return {results: results};
}
我需要做些什么才能得到结果,例如设备当前长度/纬度的10英里半径,可以通过上述功能找到。
我想在Yaks系列中找到帖子时,我会使用某种if语句或者文件管理器?
有没有人知道如何过滤帖子集合来做类似的事情呢?
如果我需要发布更多代码以便更容易理解我的问题,请告诉我,我会。
答案 0 :(得分:1)
想出来。对于任何可能在将来尝试做类似事情的人来说,这就是我所做的。
首先我将帖子位置格式化为geoJSON,然后才能进入数据库。这是我为实现这个目的而使用的代码。(注意:Gelocation.latLng();函数来自这个流星插件(https://atmospherejs.com/mdg/geolocation))。
这是在提交牦牛时调用的代码。
Template.yaksSubmit.events({
'submit .yaksSubmitForm': function(event) {
event.preventDefault();
var yak = event.target.yak.value; //get yak input value
var yakLocation = Geolocation.latLng(); // location of yak
var lat = yakLocation.lat;
var lng = yakLocation.lng;
//check if the value is empty
if(yak == "") {
alert("You can't inert a empty yak!");
} else {
Meteor.call('yakInsert', yak, lng, lat);
Router.go('yaksList');
}
}
});
这是从我的server.js文件中调用的yakInster方法。
yakInsert: function(yak, lng, lat) {
var postId = Yaks.insert({
yak: yak,
loc : {
type: "Point",
coordinates: [ lng, lat ]
},
score: 0,
submitted: new Date(),
user: Meteor.userId(),
lng: lng,
lat: lat
// Geolocation.latLng(); JSON.stringify(yakLocation)
});
}
然后我将设备long / lat存储到带有帮助程序的Session中。
Template.yakResults.helpers({
lat: function() {
var currentLocation = Geolocation.latLng(); // location of yak
var lat = currentLocation.lat;
Session.set("device-lat", lat);
},
lng: function() {
var currentLocation = Geolocation.latLng(); // location of yak
var lng = currentLocation.lng;
Session.set("device-lng", lng);
}
});
然后我的功能显示我的所有帖子,我使用了mongolab(http://blog.mongolab.com/2014/08/a-primer-on-geospatial-data-and-mongodb/)上这篇博文中解释的信息。这是函数的样子
Template.yakResults.searchResults = function () {
var lng = Session.get("device-lng");
var lat = Session.get("device-lat");
var query = new RegExp( keyword, 'i' );
var results = Yaks.find( {
loc:
{ $near :
{
$geometry:{ type:"Point", coordinates:[ lng, lat]},
$minDistance: 0,
$maxDistance: 5000
}
}
});
return {results: results};
}
这使得显示的帖子的顺序由每个牦牛/帖子相对于设备位置的位置确定。
$ minDistance& $ maxDistance以米为单位。
这可能不是让它发挥作用的最好方法,但它对我有用。只是想我会分享它,任何其他人都可以使用它。