基于位置的 GeoFire 查询。如何批量加载文件

问题描述 投票:0回答:2

我有一个基于 iOS 位置的应用程序。用户需要能够看到一定半径内附近的用户。有没有办法批量读取附近的用户文档,这样我就不会不必要地加载太多用户不会滚动的文档。因此首先显示 20 个附近的用户。然后,当用户向下滚动并到达集合中的最后一个(第 20 个)项目时,加载附近 20 个以上的用户尚未加载(仍在所需的半径内)。

如果我只是按用户的加入/注册日期读取用户,那么这样的事情很容易做到。但我不确定如何针对基于位置的查询执行此操作。

我唯一的选择是在小半径上查询,然后增加半径(这将加载之前查询中已经从数据库加载的一些文档),然后在客户端处理重复文档?

swift firebase google-cloud-firestore geofire geohashing
2个回答
0
投票

如果您查看在 Firestore 上实现地理查询的记录解决方案,您会发现它不会按邻近顺序加载文档,而是按 geohash 块加载,如下所示:

唯一的解决方法确实是从较小的半径开始加载较近的文档,然后扩大半径,直到加载了所需数量的文档。

另请参阅:


0
投票

Geohashes 是一种古老的技术。有更有效的地理查询方法,其中一种与 Firestore 完美搭配的方法是 Uber 的 H3,这是 Uber 应用程序本身使用的 Uber 开源地理空间库。该库是用 C 编写的,但 C 与 Swift 配合得很好。我在自己的 iOS 应用程序中使用它,它完全符合您的需求。

这个概念很简单。 H3 将地球平铺为六边形(尺寸从非常小到非常大不等,具体取决于您希望地理查询的粒度)。这样做的妙处在于,您可以将这些图块聚集在一起(围绕中央图块)以形成更大的六边形。如果各个瓷砖足够小并且它们形成的簇足够大,则该形状的覆盖范围将非常类似于圆形。这就是为什么 H3 非常高效,因为如果调整得当,过度查询的情况会非常少。

因此,为了使 Firestore 能够很好地发挥作用,只需为每个用户的文档提供两个属性:表示其当前位置的图块(一个 64 位整数)和表示其当前邻近度的图块簇(一个 64 位整数数组) 。同样,代表他们当前位置的图块是单个图块。代表他们当前接近度的图块是一个图块数组,这些图块是围绕代表他们当前位置的中心图块的图块环。因此,要进行地理查询,您可以通过向 H3 提供 lat-lng 坐标(将返回 64 位整数)来向 H3 询问设备的当前图块,然后要求 Firestore 查找包含此 64 位整数的所有文档其他用户的邻近阵列。当然,您可以对这些结果进行分页,这就是您最终想要的。

© www.soinside.com 2019 - 2024. All rights reserved.