android - 在 Android 范围内的 Firetore 中查询 GeoHashes

标签 android firebase google-cloud-firestore geohashing

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

观看视频并查看适用于 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 来检索“匹配”这个条件的文档:

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,而它应该只返回 Madrid poi。

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

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

最佳答案

Is possible to achieve this type of querys?

是的,这是可能的。

当您遍历 queries 时MutableSet,在每次迭代中你都会创建一个新的 Query目的。所以你不能简单地调用get()只在循环外一次,并期望所有这些查询都能正常工作。相反,您可以做的是添加 get()调用循环内的每个查询。结果对象的类型是 Task<QuerySnapshot> .添加所有这些 Task反对 List<Task<QuerySnapshot>> .最后,将该任务列表传递给 Tasks 的 whenAllSuccess(Collection> tasks)。我在以下帖子的回答中解释的方法:

关于android - 在 Android 范围内的 Firetore 中查询 GeoHashes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57496574/

相关文章:

firebase - 适用于 Google Drive 的无服务器解决方案观察变化

javascript - Cloud Firestore 文档 .get() 和 .where() 函数无法识别

Android WebView 不考虑缩放百分比

android - pendingIntent 中未更新的额外值

Android:Sherlock 操作栏下拉

swift - 将数据写入 Firebase 不起作用 - 无法将类型 'user' 的值转换为预期参数类型 'AnyObject?'

android - 当电池电量不足时,Android Oreo 不会收到 FCM 通知

firebase - Firestore 安全规则 .hasAny( ['A' 、 'B' 、 'C' ]) 仍然可以使用吗?

c# - 在 C# 中将 json 字符串写入 firestore

android - 将加速度计数据从设备坐标转换为真实世界坐标