【问题标题】:Save location with geofire on an existing document在现有文档上使用 geofire 保存位置
【发布时间】:2018-02-10 12:29:15
【问题描述】:

我想要一个使用 firebase 实时数据库来存储某种事件。 事件在其生命周期中可以具有不断变化的状态。

我希望能够获取用户当前位置附近的所有活动事件。

因为 geofire 似乎无法让我将位置保存在事件文档上,所以我必须获取该位置附近的所有事件,然后按状态和给定事件 ID 进行过滤(该事件可能吗??) .

有没有更好的办法?

谢谢!

【问题讨论】:

    标签: firebase firebase-realtime-database geofire


    【解决方案1】:

    Geofire 的工作原理是返回接近您给它的坐标的值。如需创意或入门模板,请查看https://getaa.org。 (如果您在没有会议的区域,请单击地图图标顶部中心并输入“旧金山”或“巴吞鲁日”。

    code is all on github

    这是一个代码sn-p:

    function loadQuery(lat,lng,today){
            //console.log('loadQuery function fired with ' + lat,lng,today);
            var geoKeys = [];
            var records=[];
    
    
            var geoQuery = geofire.query({
                center: [lat,lng],
                radius: radius
            });
    
            var onKeyEnteredRegistration = geoQuery.on("key_entered", function(key, location, distance) {
                geoKeys.push(key);
                //console.log('geoQuery event KEY ENTERED with key: ' + key);
            });
    
            // GeoKeys now in array
            var onReadyRegistration = geoQuery.on("ready", function() {
    
                //console.log('geoQuery event READY');
    
                if(geoKeys.length > 0){
                    toastUp('Fetching Meetings...');
                    // Get recordset for each key into sites array
                    readFirebaseNodes(geoKeys).then(function(value) {
                        //filter for today
                        var todaysMeetings = dayFilter(today);
                        drop(todaysMeetings);
                    }, function(err) {
                      //console.log(err); // Error!
                    });
                } else {
                    toastUp('No area meetings found.  You are encouraged to volunteer to add them.  Click <a href="/admin">Meetings Manager</a> to become a site administrator.');
                    toastDown(2000);
                }
            });
        }
    

    【讨论】:

      【解决方案2】:

      Firebase 实时数据库只能查询单个属性。 GeoFire 可以在两个轴(经度和纬度)上过滤的事实已经非常神奇(感谢使用 geohashes)。再增加一项价值超出了 GeoFire 的用途。

      但实际上只显示附近的活动 事件非常简单:在您的数据库中保留一个位置/参考,只显示那些活动 事件的位置。然后你可以简单地在那个位置创建一个GeoFire 对象,它只会找到附近的活动事件:

      // Create a Firebase reference where GeoFire will store its information
      var firebaseRef = firebase.database().ref("activeEventLocations");
      
      // Create a GeoFire index
      var geoFire = new GeoFire(firebaseRef);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        相关资源
        最近更新 更多