使用 GeoFire 按半径查询位置

Ash*_*087 2 node.js firebase geofire

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

\n\n

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

\n\n

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

\n\n

请注意,我不是在寻求实时数据。这些位置之前已存储,并且不会经常更改。

\n\n

预先感谢\xe2\x80\xa6

\n\n

在此输入图像描述

\n

Mic*_*ati 5

就目前而言,它geofire充当进行地理查询的索引,并提供您想要的文档的键(它将存储在单独的“集合”中)。

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

var firebaseRef = firebase.database().ref('eventPlaces');
var geoFire = new GeoFire(firebaseRef);
Run Code Online (Sandbox Code Playgroud)

现在您可以使用它作为事件的索引,并且可以像这样向其中添加项目。

geoFire.set('-K_Pp-3RBJ58VkHGsL5P', [40.607765, -73.758949]);
Run Code Online (Sandbox Code Playgroud)

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

{
   'events': {
        '-K_Pp-3RBJ58VkHGsL5P': {
            // All your data here
        }
    },
   'eventPlaces': {
        '-K_Pp-3RBJ58VkHGsL5P': {
            'g': 'dr5x186m7u',
            'l': [40.607765, -73.758949]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以最后当您对您的进行查询时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)');
});
Run Code Online (Sandbox Code Playgroud)

您最终将返回文档的密钥,您可以为此单个文档执行正常的 Firebase 查询。