【问题标题】:Ordering Firestore GeoHash query from closest to furthest?从最近到最远订购 Firestore GeoHash 查询?
【发布时间】:2019-05-20 00:14:23
【问题描述】:

目前,我正在使用部分 GeoFirebase 库和 Firestore 来进行地理查询。当我设置帖子的 geohash 时,我会这样做 if let geoHash = GFGeoHash(location: location.coordinate).geoHashValue {

但是,为了使 geohash 查询不那么具体,我计划在查询时截断部分 geohash;目前,查询看起来与此类似

 var geoQuerySpecific = GFGeoHashQuery()
        let geoQueryHash =  GFGeoHashQuery.queries(forLocation: (lastLocation?.coordinate)!, radius: (30)) as! Set<GFGeoHashQuery>

        for query in geoQueryHash {
            geoQuerySpecific = query
            print("the key is this um \(geoQuerySpecific)")
        }
        print("the starting value is \(geoQuerySpecific.startValue)  and the end value is \(geoQuerySpecific.endValue)")
        let nearQuery = Firestore.firestore().collection("stuff").order(by: "g").whereField("g", isGreaterThanOrEqualTo: geoQuerySpecific.startValue).whereField("g", isLessThanOrEqualTo: geoQuerySpecific.endValue)

如您所见,这将无法正常工作,因为 geoQueryHash 中有多个项目。当我在firebase中设置geohash时,我考虑过截断geohash的最后四个数字/字母,但是,这还不够具体。为了获得最近的帖子,最好像我现在一样在数据库中设置geoHashes,然后,在检索内容时,将起始值设为查询的最具体的geohash,然后将结束值设为geohash 的截断版本,从获取最近的帖子开始,以最广泛的帖子结束?

我可以将 Firestore 查询限制为 50,这样我就可以检索从最近到最远的 50 个帖子...我对地理散列的理解是否正确?这可行吗?

从概念上讲,如果有一种方法可以将 geohashes 存储为整数,那么我可以让 firestore 查询从最大整数(即最精确的 Geohash)开始,然后通过降序对查询进行排序,直到它达到最不精确的强度(最广泛的geoHash),然后将其限制为50。

【问题讨论】:

    标签: geolocation google-cloud-firestore geofire geohashing geofirestore


    【解决方案1】:

    GeoFirestore 使用 geohashes 能够选择地理哈希范围内的文档,该范围与地图上的区域大致相同。仅通过地理查询无法从该区域内以指定顺序检索这些文档。如果您想按距离对文档进行排序,则必须在地理查询之后的应用程序代码中执行此操作。

    如果您想了解更多关于为什么会这样,请查看我不久前的演讲:Querying Firebase and Firestore based on geographic location or distance。在其中,我解释了 geohashes 的工作原理,它们如何允许您选择特定地理范围内的文档,以及为什么您不能在 Firestore(或 Firebase 的原始实时数据库)上进行更复杂的查询。

    【讨论】:

    • 我理解它的这一方面,但我是从可以排序的字母数字字符串的角度考虑它们。例如,如果我从 gh67 开始,那将是最一般的领域,但如果我去 gh674df5,那将更加具体。从这个角度来看,是否不可能进行从 gh674df5 开始并以 gh67 结束的查询?字母数字字符串可以这样排序吗?
    • 在某些极端情况下,您可能可以选择这样的子范围,但通常不会。但它也不一定会从最近到最远返回项目。
    • 文档中的 geohashes 都是相同的长度。您可以为每个文档添加多个地理哈希,每个用于特定的分辨率。但它仍然对这个用例没有帮助。
    • 以多个分辨率存储分辨率是不够的,因为您的查询中心很少与 geohash 的中心重合。但是存储多个分辨率本质上是像 S2 这样的解决方案所做的。
    • 我发现很难从抽象中推理 geohashes,所以绝对建议尝试一下。如果您要走这条路,请查看 S2,它解决了两极周围地理哈希的边缘情况,更专注于多分辨率,并减少了所有解决方案的过度阅读量。
    猜你喜欢
    • 2018-08-25
    • 2017-01-06
    • 2019-02-13
    • 2020-08-26
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多