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的形式完成的.其中一些特点:
它是一种分层空间数据结构,它将空间细分为网格形状的桶
因此:Geohashes将空间划分为一个桶网格,每个桶由一个字符串标识.
Geohashes提供了诸如任意精度之类的属性,并且可以逐渐从代码末尾删除字符以减小其大小(并逐渐失去精度).
弦越长,铲斗覆盖的面积越大
由于逐渐精确度降低,附近的地方通常(但不总是)呈现类似的前缀.共享前缀越长,两个位置越接近.
以相同字符开头的字符串彼此接近.
结合这些特征,您可以看到为什么这些Geohashes对于使用Firebase数据库非常有吸引力:它们将位置的纬度和经度组合成单个字符串,其中按字典顺序彼此靠近的字符串指向物理上靠近的位置对彼此.魔法!
Firebase提供了一个名为Geofire的库,它使用Geohashes在其实时数据库之上实现Geolocation系统.该库可用于JavaScript,Java和Objective-C/Swift.
要了解有关Geofire的更多信息,请查看:
.| 归档时间: |
|
| 查看次数: |
9330 次 |
| 最近记录: |