【问题标题】: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);