查找用户位置周围各种半径的点

Finding points with various radiuses around user location

我正在为我的一个项目使用 Firebase,想知道使用 Geofire 是否可以实现以下目标。

我有一个点列表,其中包含可用的半径(纬度、经度、半径)。在所附的图像中,蓝色圆圈是由点及其半径创建的。

我想找到所有到达用户位置的圆圈(红色圆圈 - 只是一个点)。我想要达到的最终效果类似于看到你周围的所有 wifi 网络 - 其中一些可能信号更强。

可以用Geofire完成吗?如果是,我应该如何处理查询?

Firebase 无法处理这样的查询,因为您不能在 orderBy 中包含逻辑。我不确定 geofire 是否可以绕过该限制(从我浏览过的文档来看它不能)所以我们必须想出另一种方法来做到这一点。如果您知道其中一个圆圈的最大尺寸,我们也许可以粗略地找出哪些圆圈可以 select。

(旁注,我假设你只想要顶半球的东西,如果你想同时处理这两个问题,还有更多的数学知识,但我不会在这里详述)

我将粗略地描述如何去做,latitude/longitude 是棘手的,因为你靠近两极,半径并不总是在赤道附近平移 1 - 1 圆,因为它在更远的北方.在大多数情况下,这个想法会奏效,但确定 min/max 的数学方法以及循环的最后一步都会发生变化。

  1. 根据红点和最大圆半径创建以下变量
    • minLatitude:(红圈纬度)-(最大圆半径)
    • maxLatitude:(红圈纬度)+(最大圆半径)
    • minLongitutde: (红圈经度) - (最大圆半径)
    • maxLongitutde: (红圈经度) + (最大圆半径)
  2. 您必须更新您的数据库,以便为每个包含具有特定小数精度的纬度和经度的蓝色圆圈提供可搜索的索引。
    • 类似于 LATITUDE_LONGITUDE。
  3. 执行如下查询:... orderByChild('_latitude_longitude').startAt(minLatitude + '_' + minLatitude).endAt(maxLatitude + '_' + maxLongitutde)(不要忘记确保这些都具有相同的精度)
  4. 这将 return 显示在红色圆圈最大半径范围内的所有圆圈
  5. 然后你必须遍历所有的圆 returned 并查看是否基于它们自己的半径是否包含红色圆(这里的数学公式非常简单,网上有很多例子)

这是我能想到的唯一没有服务器端处理的方法。