MeteorJS:显示位于当前位置x英里内的位置的帖子

时间:2015-08-30 19:39:19

标签: javascript meteor geolocation

我正在处理一个应用程序,该应用程序将显示距其位置一定距离的人员帖子。

每当创建一个帖子时,就会创建一个位置值,该值存储在:{" lat":39.7230949," lng": - 104.83521619999999}。制作帖子时当前位置的纬度和经度。

这是一个函数Ge​​olocation.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语句或者文件管理器?

有没有人知道如何过滤帖子集合来做类似的事情呢?

如果我需要发布更多代码以便更容易理解我的问题,请告诉我,我会。

1 个答案:

答案 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以米为单位。

这可能不是让它发挥作用的最好方法,但它对我有用。只是想我会分享它,任何其他人都可以使用它。

相关问题