查询附近地点

问题描述 投票:0回答:1

我使用Firebase来存储用户最后扫描的经纬度。

一个条目是这样的。

"Bdhwu37Jdmd28DmenHahd221" : {
  "country_code" : "at",
  "firstname" : "John",
  "gender" : "m",
  "lat" : 11.2549387,
  "lon" : 17.3419559
}

每当用户按下一个特定的 "搜索 "按钮时 我希望我的Firebase函数能够获取离发出请求的人最近的人的信息

由于Firebase只允许在一个字段后进行查询,所以我决定添加国家代码(country_code),算是对这个字段有一些范围限制和查询。但是,当我加载某个国家的每个用户,然后检查某个用户与同一国家的所有其他用户之间的最小距离时,速度还是超级慢。

已经有5个用户了,这个函数需要40秒左右才能实现结果。

我也读过复合索引,但我需要以某种方式将纬度和经度结合起来,然后查询这两个字段。

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

angular firebase ionic4
1个回答
27
投票

Firebase数据库只能按单一属性查询。所以对经纬度值进行过滤的方法是将它们组合成一个属性。这个合并后的属性必须保留你对数值的过滤特性,比如可以过滤一个范围。

虽然这乍一看似乎是不可能的,但实际上已经通过以下形式实现了。地缘切口. 它的几个特点。

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

所以,地理哈希将空间划分为一个个小桶,每个小桶由一个字符串来标识。Geohashes将空间划分为一个个桶状的网格,每个桶状的网格由一个字符串来标识。

  1. Geohashes提供了一些特性,比如任意的精度,以及可以从代码末尾逐渐删除字符以减小其大小(并逐渐失去精度)。

字符串越长,水桶覆盖的面积就越大。

  1. 由于精度逐渐下降,附近的地方经常(但并不总是)会出现类似的前缀。共享前缀越长,两个地方就越接近。

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

结合这些特征,你就可以看到为什么这些Geohashes对于Firebase数据库的使用如此吸引人:它们将一个地点的经纬度结合到一个字符串中,其中在词法上彼此接近的字符串指向物理上彼此接近的地点。Magic!

Firebase提供了一个名为Geofire的库,它使用Geohashes在其Realtime Database之上实现了一个Geolocation系统。该库可用于 脚本语言, 爪哇Objective-CSwift.

要了解更多关于Geofire的信息,请查看。

© www.soinside.com 2019 - 2024. All rights reserved.