Firebase 在现有文档上使用geofire保存位置
我想要一个使用firebase实时数据库来存储某种事件。 事件在其生命周期中的状态可能会发生变化 我希望能够获取用户当前位置附近的所有活动事件 因为geofire似乎不允许我保存事件文档上的位置,所以我必须获取该位置附近的所有事件,然后根据状态和给定的事件ID进行过滤(该事件可能吗??) 有更好的办法吗Firebase 在现有文档上使用geofire保存位置,firebase,firebase-realtime-database,geofire,Firebase,Firebase Realtime Database,Geofire,我想要一个使用firebase实时数据库来存储某种事件。 事件在其生命周期中的状态可能会发生变化 我希望能够获取用户当前位置附近的所有活动事件 因为geofire似乎不允许我保存事件文档上的位置,所以我必须获取该位置附近的所有事件,然后根据状态和给定的事件ID进行过滤(该事件可能吗??) 有更好的办法吗 谢谢 Firebase实时数据库只能查询单个属性。GeoFire可以在两个轴(经度和纬度)上进行过滤这一事实已经相当神奇了(多亏了GeoHash的使用)。在混合中再增加一个价值超出了GeoFir
谢谢 Firebase实时数据库只能查询单个属性。GeoFire可以在两个轴(经度和纬度)上进行过滤这一事实已经相当神奇了(多亏了GeoHash的使用)。在混合中再增加一个价值超出了GeoFire的用途 但实际上,只显示附近的活动事件非常简单:在数据库中保留一个位置/引用,其中只包含这些活动事件的位置。然后,您只需在该位置创建一个
GeoFire
对象,它将只查找附近的活动事件:
Geofire的工作原理是返回与您给出的坐标接近的内容。有关想法或入门模板,请查看。(如果您所在的区域没有会议,请单击地图图标上中,然后输入“旧金山”或“巴吞鲁日”。) 这个 下面是一段代码片段:
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);
}
});
}
功能加载查询(lat、lng、今日){
//log('loadQuery函数通过'+lat,lng,今日]激发);
var geoKeys=[];
var记录=[];
var geoQuery=geofire.query({
中心:[拉丁美洲,液化天然气],
半径:半径
});
var onKeyEnteredRegistration=geoQuery.on(“输入键”),函数(键、位置、距离){
地理键。按(键);
//console.log('geoQuery事件键与键一起输入:'+键);
});
//地理键现在处于阵列中
var onReadyRegistration=geoQuery.on(“就绪”,函数(){
//log(“geoQuery事件就绪”);
如果(geoKeys.length>0){
toastUp(‘召集会议……’);
//将每个键的记录集获取到sites数组中
readFirebaseNodes(地理键)。然后(函数(值){
//今天的过滤器
var todaysMeetings=dayFilter(今天);
下降(今天的会议);
},函数(err){
//console.log(err);//错误!
});
}否则{
toastUp('未找到区域会议。鼓励您自愿添加这些会议。单击以成为站点管理员');
toastDown(2000年);
}
});
}
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);
}
});
}