【问题标题】:Firestore - Possible GeoQuery WorkaroundFirestore - 可能的 GeoQuery 解决方法
【发布时间】:2018-06-04 04:58:53
【问题描述】:

由于尚不支持原生地理查询,我想了一个可能的解决方案,但想知道它的有效性和有效性。

我想要什么:我有大约 2000 个文档的集合,每个文档都包含一个 Geopoint。 例如,我想查询离用户当前位置最近的 20 个文档。

可能的解决方案:我可以在集合中创建另一个文档并将其作为我的“索引”吗?每个字段名称都是每个文档 ID 的字符串。每个字段的值将是相应的地理点。 然后,当应用程序打开时,我只需要 1 次读取操作......然后我可以使用函数来处理 2000 个文档字段来计算和排序每个位置与用户的距离吗?最后,我是否可以获取最接近的 20 个结果,然后创建一个侦听器并仅提取这些结果?

编辑:尝试了我的建议。在遇到不断的问题后放弃。 我得到了整个索引文档的工作,并且能够下载它,安排它以找到最近的位置和相关的文档 ID。但是,我在使用文档 ID 数组设置侦听器时遇到了很多问题。我使用 for 循环遍历数组中的每个 ID 并为每个 ID 设置一个侦听器,但它只做过第一个,并且随机崩溃不断发生。此外,我注意到获取文档需要更长的时间......所以,我决定放弃高精度解决方案,只查询地理点以在用户周围的方格内查找位置。

【问题讨论】:

    标签: java firebase kotlin google-cloud-firestore geofire


    【解决方案1】:

    我认为最简单的方法是使用 Firestore Geopoints 进行查询,您可以这样做:

    fun Query.getNearestLocation(latitude: Double, longitude: Double, distance: Double): Query {
        // ~1 mile of lat and lon in degrees
        val lat = 0.0144927536231884
        val lon = 0.0181818181818182
    
        val lowerLat = latitude - (lat * distance)
        val lowerLon = longitude - (lon * distance)
    
        val greaterLat = latitude + (lat * distance)
        val greaterLon = longitude + (lon * distance)
    
        val lesserGeopoint = GeoPoint(lowerLat, lowerLon)
        val greaterGeopoint = GeoPoint(greaterLat, greaterLon)
    
        val docRef = FirebaseFirestore.getInstance().collection("locations")
        return docRef
                .whereGreaterThan("location", lesserGeopoint)
                .whereLessThan("location", greaterGeopoint)
    }
    

    它也写在 Kotlin 上。此代码是由 Ryan Lee 在this post 上制作的代码的 Kotlin 翻译。

    【讨论】:

    • 谢谢,我已经看到了该答案的几个示例(但不确定为什么必须使用英里)。欣赏 Kotlin 翻译,让我不必这样做。唯一的事情是,我相信这会在用户位置周围的“正方形”内提供位置。我目前正在尝试根据我的问题/建议实施一个解决方案,但我一定会将其与您的解决方案进行比较,并测试完成时间和准确性方面的差异。
    • 感谢您接受我的正确回答。您是否找到了以您想要的方式测量您的位置的方法?
    • 没关系,您的解决方案实施起来更容易、更快捷,而且精度差异现在无关紧要。我几乎完全使用了您的代码,但改为支持公里而不是英里。查询现在很好用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2017-05-27
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多