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

时间:2016-09-08 16:16:10

标签: ios firebase firebase-realtime-database gis geofire

我在其中一个项目中使用Firebase,并且想知道使用Geofire是否可以实现以下目标。

我有一个带有半径的点列表(lat,lng,radius)。在附加的图像中,蓝色圆圈由点及其半径创建。

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

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

enter image description here

1 个答案:

答案 0 :(得分:1)

Firebase无法处理此类查询,因为您无法在orderBy中使用逻辑。我不确定geofire可以解决这个限制(从我浏览过的文档中不能),所以我们必须想出另一种方法。如果您知道其中一个圆圈的最大尺寸,我们可能会大致计算出要选择的圆圈。

(旁注,我假设你只想要在顶部半球的东西,如果你想要处理这两个东西,还有更多的数学,但我不会在这里详细介绍)

我将大致描述如何做到这一点,纬度/经度是非常棘手的,因为你靠近极点并且半径并不总是在赤道附近转向1 - 1,因为它向北更远。在大多数情况下,这个想法是可行的,但确定最小值/最大值的数学运算将会改变,也可能是循环的最后一步。

  1. 根据红点和最大圆半径创建以下变量
    • minLatitude :(红色圆圈纬度) - (最大圆半径)
    • maxLatitude :(红色圆圈纬度)+(最大圆半径)
    • minLongitutde :(红色圆圈经度) - (最大圆半径)
    • maxLongitutde :(红色圆圈经度)+(最大圆弧半径)
  2. 您必须更新您的数据库以获得一个索引,该索引可以搜索包含纬度和经度且具有特定小数精度的每个蓝色圆圈。
    • 类似LATITUDE_LONGITUDE。
  3. 执行以下查询:... orderByChild('_latitude_longitude').startAt(minLatitude + '_' + minLatitude).endAt(maxLatitude + '_' + maxLongitutde)(不要忘记确保这些都具有相同的精度)
  4. 这将返回所有圈子,这些圈子将位于红圈的最大半径范围内
  5. 然后你必须遍历返回的所有圆圈,看看是否根据自己的半径确定是否包含红色圆圈(这里有非常简单的数学公式,网上有很多例子)
  6. 这是我能想到的唯一没有服务器端处理的方法。