【问题标题】:How to orderBy the closest distance from current location in AngularFire2?如何从AngularFire2中当前位置的最近距离订购?
【发布时间】:2018-10-11 05:44:59
【问题描述】:

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

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

我有我当前位置的latitudelongitude,并且我有一个辅助函数,可以确定当前位置与来自 Firebase 数据的位置之间的距离(以米为单位)。假设,函数如下:

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));

这是为什么呢? startAtendAt 应该与 limitToFirst(10) 一样工作。

那么,查询应该是什么,以便我可以返回 10 行,这些行是距我当前位置排序距离 内的?

【问题讨论】:

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


    【解决方案1】:

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

    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));
    

    其次,根据 order-by-method,此行不一定会返回 10 条记录,而是返回 order-by 参数在 0 到 10 之间的所有记录。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        相关资源
        最近更新 更多