Geofire如何计算Firebase查询的边界地理哈希?

迅雷结构

语境

我已经将Geofire和Firebase一起使用了一段时间,我真的很好奇Geofire如何执行其查询。我理解从语义上讲,它是坐标和半径的函数,会导致最小和最大哈希值。所以我认为它与Firebase结合使用的方式看起来像这样

ref.child("users").orderByChild("g").startAt(minHash).endAt(maxHash).on('child_added', function(snapshot) { /* retrieved snapshot contains the geohashes in range */ });

从给定输入中计算出这两个(最小和最大)地理哈希值的位置。现在来了一个问题

问题)

假设我上面所说的是正确的,那么如何计算这两个地质哈希?当几何哈希通常表示边界矩形时,它们如何在某个圆形区域内返回结果最后,两个不同大小的地质哈希如何具有相同的中心?

为了澄清最后一部分:考虑下图

典型的哈希处理步骤

由于地理哈希通过将区域减半成较小的区域而起作用,因此两个不同大小(最小和最大)的散列如何具有相同的中心点?

假设条件

我认为这可能就像增加/减少散列的原始值一样简单,但这没有多大意义,因为增加/减少应相对于散列的大小(可以说是“缩放”级别)和查询半径(如果我没有记错的话)。

弗兰克·范普菲伦

GeoFire实际上针对数据库对矩形区域执行范围查询。此范围是包含查询中指示的范围的最小矩形。

然后,它在客户端代码检查每个键查询的中心的实际距离,并仅将触发key_entered/key_moved物品事件内部查询。

相关代码在这里

// Determine if the location is within this query
distanceFromCenter = GeoFire.distance(location, _center);
isInQuery = (distanceFromCenter <= _radius);

...

// Fire the "key_entered" event if the provided key has entered this query
if (isInQuery && !wasInQuery) {
  _fireCallbacksForKey("key_entered", key, location, distanceFromCenter);
} else if (isInQuery && oldLocation !== null && (location[0] !== oldLocation[0] || location[1] !== oldLocation[1])) {
  _fireCallbacksForKey("key_moved", key, location, distanceFromCenter);
} else if (!isInQuery && wasInQuery) {
  _fireCallbacksForKey("key_exited", key, location, distanceFromCenter);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章