在 Android 范围内查询 Firestore 中的 GeoHashes

Query GeoHashes in Firetore in range Android

我正在尝试获取某个点范围内的文档。

观看视频并查看 android 的地理哈希库,我能够获取边界框并获得必要的地理哈希以在 firebase 中查询。

例如:

点 -> LatLng(40.4378698,-3.8196205)(西班牙马德里)

半径 -> 5000米(5 公里)

我得到的边界框是:

[GeoHashQuery{startValue='ezjnh', endValue='ezjns'}, GeoHashQuery{startValue='ezjjs', endValue='ezjj~'}, GeoHashQuery{startValue='ezjq0', endValue='ezjq8'}, GeoHashQuery{startValue='ezjm8', endValue='ezjmh'}]

我有这个列表,我调用 Firebase 来检索 "match" 这个标准的文档:

fun getUpTos(queries: MutableSet<GeoHashQuery>, onSuccessListener: OnSuccessListener<QuerySnapshot>, onFailureListener: OnFailureListener) {
        var reference = Firebase.firestore.collection("pois")
        queries.forEach { entry ->
            reference
                .whereGreaterThanOrEqualTo("geohash", entry.startValue)
                .whereLessThanOrEqualTo("geohash", entry.endValue)
        }

        reference.get()
            .addOnSuccessListener(onSuccessListener)
            .addOnFailureListener(onFailureListener)
    }

此时我在 firebase 中有大约 20 个 Poi 可以开始进行测试。所有 Poi 都在巴塞罗那,1 个在马德里。

完成查询后,我得到了所有 poi,而它应该只是 return 马德里 poi。

我怎样才能只得到适合查询的点?似乎工作不正常(或者我明显做错了什么)

是否可以实现这种类型的查询?

Is possible to achieve this type of querys?

是的,有可能。

当您迭代 queries MutableSet 时,每次迭代都会创建一个新的 Query 对象。因此,您 不能 只需在循环外调用 get() 一次并期望所有这些查询都能正常工作。您可以做的是将 get() 调用添加到循环内的每个查询。结果对象的类型是 Task<QuerySnapshot>. Add all those Task objects to a List<Task<QuerySnapshot>>. In the end, pass that list of tasks to Tasks's whenAllSuccess(Collection> tasks) 方法,正如我在以下 post:

的回答中所解释的