从最接近的订购Firestore GeoHash查询?

时间:2019-05-20 00:14:24

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

当前,我正在使用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的最后四位数字/字母截断,但这还不够具体。要获取最近的帖子,最好将数据库中的geoHashes设置为当前状态,然后在检索内容时,将起始值设为查询的最特定geohash,然后将end值设为截断版本的geohash,是从获得最近的帖子开始,到以最广泛的帖子结束?

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

从理论上讲,如果有一种方法可以将geohash存储为整数,那么我可以使firestore查询从最大整数(即最精确的Geohash)开始,然后通过递减查询直到降到最不精确的强度(最宽的geoHash),然后将其限制为50。

1 个答案:

答案 0 :(得分:2)

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

如果您想了解更多有关其原因的信息,请看我前一段时间的演讲:Querying Firebase and Firestore based on geographic location or distance。在其中,我解释了地理哈希的工作原理,它们如何允许您在特定地理范围内选择文档,以及为什么无法在Firestore(或Firebase的原始实时数据库)上执行更复杂的查询。