如何订购距离AngularFire2当前位置最近的距离?

时间:2018-05-01 06:26:21

标签: firebase ionic-framework firebase-realtime-database ionic3 angularfire2

我正在使用AngularFire2库在firebase中进行查询。在我的firebase中,我有数据集合,在其中,我有很多行latitudelongitude,如下所示:

- data
    - 1404033346513076_1998422263740845
        - location
           - latitude: 23.7907795
           - longitude: 90.403898
    - 1404033346513076_1998422263740888
        - location
           - latitude: 23.9907795
           - longitude: 91.403898

我拥有当前位置的latitudelongitude,并且我有一个辅助函数,可以确定当前位置与火力基础数据的位置之间的距离。假设,功能如下:

calculateDistance(currentLoc, destLoc) {
  return routeDistance(currentLoc, destLoc); // It return in meters
}

现在,我需要一个查询,它将从firebase返回10行,这些行与当前位置的距离最近。

我知道,我可以在firebase中查询如下:

  constructor(private firebaseDBProvider: AngularFireDatabase) {
  }

  getDatas(): any {
    return this.firebaseDBProvider.list('data', ref => ref.orderByChild("location").startAt(0).endAt(3));
  }

但是,它不会提供我想要的确切数据。

另一件事,我注意到,当我在查询下运行时,它会返回前10行。

return this.firebaseDBProvider.list('data', ref => ref.limitToFirst(10));

但是,如果要执行以下查询,则会返回 0 行。

this.firebaseDBProvider.list('data', ref => ref.startAt(0).endAt(10));

为什么? startAt endAt 应与 limitToFirst(10)相同。

那么,查询应该是什么,以便我可以从当前位置返回10行 sortest distance

2 个答案:

答案 0 :(得分:2)

您的帖子中有两个问题。让我们尝试回答每个问题。

Q1:"我需要一个查询,它将从firebase返回10行,这些行距离当前locationList项目的最近距离"

A1:您可能知道,您将无法使用" Firebase数据库查询引擎"在查询时触发calculateDistance()功能,即Firebase只能根据此处详述的方法https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data进行排序。

换句话说,您必须在可以执行您的函数的环境中循环来自data节点的整个数据集:在您的前端或可能在云函数中(例如, HTTPS,作为REST API)

Q2:"为什么? startAt和endAt应该与limitToFirst(10)相同。"

A2:不,他们是不同的。

正如文档中所述," startAt()返回大于或等于指定键或值的项目,取决于所选择的订购方法"

首先,您必须在此行中包含逐个方法

this.firebaseDBProvider.list('data', ref => ref.startAt(0).endAt(10));

其次,根据逐个方法,这一行不一定会返回10个记录,而是所有order-by参数在0到10之间的记录。

答案 1 :(得分:0)

我认为,使用GeoFire可以获得最近距离获取数据顺序的解决方案。