Firebase查询附近的对象

vzh*_*hen 4 firebase

在mysql中,我使用hasrsine公式来查询附近的对象.

使用这个公式

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
Run Code Online (Sandbox Code Playgroud)

哪一个

  • 3959:以英里为单位的地球半径
  • 37,-122:给定lat lng
  • 25:25英里内

在Firebase中,我可以像在mysql中一样存储用户吗?创建标记表.id,lat,lng列然后使用公式进行查询

更新

我应该问一下,在firebase中使用这个公式查询附近的方法是什么.

SH-*_*SH- 8

简短的回答,不像你想要的那样.

Firebase本质上有两种查询数据的方法:按路径和优先级.这比SQL更有限,并且有一个很好的理由 - 我们的API经过精心设计,只允许我们可以保证快速运行.Firebase是一个实时且可扩展的后端,我们希望您能够构建出色的应用程序,可以为数百万用户提供服务,而不会影响响应速度.

看看什么是firebase和deNormalizing数据 另外,这个SO问题是类似的.

对评论的回复:Firebase不会sin( radians(X) )为您计算.这是一个"缓慢"的操作.因此,您需要在保存时将该信息存储到数据中.我不是100%肯定,但你可以存储标记,并且还将经度/纬度存储在单独的父级中.

Root
    -> Markers
    -> longitude (Use the value as priority) -> MarkerId
    -> latitude (Use the value as priority) -> MarkerId
Run Code Online (Sandbox Code Playgroud)

然后你应该能够使用边界来找到最大和最小经度和纬度.用它来按优先级查询经度和纬度路径.如果两者都存在MarkerId,则使用它.

一篇快速的研究发现了这篇关于纬度经度边界坐标的文章