Radius使用GeoFire查询位置

时间:2018-08-26 15:25:30

标签: node.js firebase geofire

我知道这是一个基本问题,但是我仍然遇到很多麻烦。

我有一个存储社区事件的Firebase数据库。每个事件节点都有一个地理位置节点(使用GeoFire创建),称为 eventPlace (请参见下面的屏幕截图)。

使用GeoFire(和javascript),如何查询整个数据库并获取某个位置/半径内的所有事件?考虑到数据的存储方式,这可能吗?还是我需要将所有位置节点移动到一个公共节点(eventPlaces ??)并查询该单个父节点?

请注意,我不是在寻找实时数据。这些位置是以前存储的,不会经常更改。

预先感谢...

enter image description here

1 个答案:

答案 0 :(得分:2)

目前geofire可以作为进行地理查询的索引,并提供所需文档的密钥(将其存储在单独的“集合”中)。

您应该使用geofire和一个单独的“集合”(将其称为 eventPlaces

var firebaseRef = firebase.database().ref('eventPlaces');
var geoFire = new GeoFire(firebaseRef);

现在,您可以将其用作事件的索引,并可以向其中添加项目。

geoFire.set('-K_Pp-3RBJ58VkHGsL5P', [40.607765, -73.758949]);

您的Firebase RTDB现在将如下所示:

{
   'events': {
        '-K_Pp-3RBJ58VkHGsL5P': {
            // All your data here
        }
    },
   'eventPlaces': {
        '-K_Pp-3RBJ58VkHGsL5P': {
            'g': 'dr5x186m7u',
            'l': [40.607765, -73.758949]
        }
    }
}

最后,当您对geoFire进行查询时:

geoFire.query({
  center: [40.607765, -73.758949],
  radius: 10
}).on('key_entered', (key, location, distance) => {
  console.log(key + ' entered query at ' + location + ' (' + distance + ' km from center)');
});

您最终将获得该文档的密钥,为此您可以对该单个文档进行常规的Firebase查询。