查询附近的位置

Tho*_*mas 13 firebase firebase-realtime-database

我正在使用Firebase来存储用户上次扫描的纬度和经度.

条目如下所示:

"Bdhwu37Jdmd28DmenHahd221" : {
  "country_code" : "at",
  "firstname" : "John",
  "gender" : "m",
  "lat" : 11.2549387,
  "lon" : 17.3419559
}
Run Code Online (Sandbox Code Playgroud)

每当用户按下特定的"搜索"按钮时,我希望我的Firebase功能可以获取离发送请求的人最近的人.

由于Firebase只允许在一个字段后查询,因此我决定添加country_code,以便对该字段进行一些范围限制和查询.但是当我加载特定国家/地区的每个用户然后检查给定用户与同一国家/地区中所有其他用户之间的最小距离时,它仍然非常慢.

已经有5个用户,该功能需要40秒才能达到效果.

我还读过有关复合索引的内容,但我需要以某种方式结合纬度和经度并查询这两个字段.

有没有办法让这里涉及第二个和第三个查询(例如搜索相同的country_code,然后搜索类似的经度和纬度)或者我是否必须在我的服务器代码中解决这个问题?

Fra*_*len 23

Firebase数据库只能通过单个属性进行查询.因此,过滤纬度和经度值的方法是将它们组合成单个属性.组合属性必须保留数字值所需的过滤特性,例如过滤范围的能力.

虽然这看起来似乎不太可能,但它实际上是以Geohashes的形式完成的.其中一些特点:

  1. 它是一种分层空间数据结构,它将空间细分为网格形状的桶

因此:Geohashes将空间划分为一个桶网格,每个桶由一个字符串标识.

  1. Geohashes提供了诸如任意精度之类的属性,并且可以逐渐从代码末尾删除字符以减小其大小(并逐渐失去精度).

弦越长,铲斗覆盖的面积越大

  1. 由于逐渐精确度降低,附近的地方通常(但不总是)呈现类似的前缀.共享前缀越长,两个位置越接近.

以相同字符开头的字符串彼此接近.

结合这些特征,您可以看到为什么这些Geohashes对于使用Firebase数据库非常有吸引力:它们将位置的纬度和经度组合成单个字符串,其中按字典顺序彼此靠近的字符串指向物理上靠近的位置对彼此.魔法!

Firebase提供了一个名为Geofire的库,它使用Geohashes在其实时数据库之上实现Geolocation系统.该库可用于JavaScript,JavaObjective-C/Swift.

要了解有关Geofire的更多信息,请查看: