2017-02-12 78 views
1

语境Geofire如何计算Firebase查询的边界地理杂凑?

我用Geofire与火力地堡一起,而现在,我得到了真的很好奇Geofire如何执行其查询。我从语义上理解,它是坐标和半径的函数,可以产生最小和最大哈希值。所以我觉得它的方式关头可与火力地堡看起来像这样

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

当这两个(最小值和最大值)geohashes计算离给定输入。现在,这里是问题

问题(S)

假设我上面所述是正确的,如何这两个geohashes计算?当地理杂乱通常代表边界矩形时,他们如何在某个圆形区域内返回结果?最后,不同大小的两个geohashes如何具有相同的中心?

要澄清的是最后一部分:考虑下面的图像

Typical geohashing steps

由于通过平分的区域分成更小的区域geohashing作品,不同的大小(最小和最大)的两个散列怎么可以有相同的中心点?

假设

我想,也许这是为增加/减少哈希的原始值一样简单,但是这并没有太大的意义,因为增加/减少应该是相对的大小散列(可以说是“缩放”级别)和查询半径(如果我没有弄错的话)。

回答

3

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

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

相关的代码是here

// 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); 
}