Geofire 如何计算 Firebase 查询的边界 geohashes?
How does Geofire calculate bounding geohashes for Firebase queries?
上下文
我已经将 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 */ });
这两个(最小和最大)geohashes 是根据给定的输入计算的。现在问题来了
问题
假设我上面说的是正确的,那这两个geohashes是怎么计算出来的呢?当 geohashes 通常表示边界矩形时,它们如何 return 在某个 圆形 区域内产生结果?最后,两个不同大小的geohashes怎么可能有相同的中心?
澄清最后一部分:考虑下图
由于 geohashing 的工作原理是将区域分成更小的区域,两个不同大小(最小值和最大值)的哈希值如何具有相同的中心点?
假设
我想也许它就像 increasing/decreasing 散列的原始值一样简单,但这没有多大意义,因为 increase/decrease 应该与散列的大小相关( "zoom" 水平)和查询半径,如果我没记错的话。
GeoFire 实际上对数据库执行矩形区域的范围查询。此范围是包含查询中指示的范围的最小矩形。
然后在 client-side 代码中检查每个键到查询中心的实际距离,并且只为项目 [=20= 触发 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);
}
上下文
我已经将 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 */ });
这两个(最小和最大)geohashes 是根据给定的输入计算的。现在问题来了
问题
假设我上面说的是正确的,那这两个geohashes是怎么计算出来的呢?当 geohashes 通常表示边界矩形时,它们如何 return 在某个 圆形 区域内产生结果?最后,两个不同大小的geohashes怎么可能有相同的中心?
澄清最后一部分:考虑下图
由于 geohashing 的工作原理是将区域分成更小的区域,两个不同大小(最小值和最大值)的哈希值如何具有相同的中心点?
假设
我想也许它就像 increasing/decreasing 散列的原始值一样简单,但这没有多大意义,因为 increase/decrease 应该与散列的大小相关( "zoom" 水平)和查询半径,如果我没记错的话。
GeoFire 实际上对数据库执行矩形区域的范围查询。此范围是包含查询中指示的范围的最小矩形。
然后在 client-side 代码中检查每个键到查询中心的实际距离,并且只为项目 [=20= 触发 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);
}