Firestore - 可能的GeoQuery解决方法

时间:2018-06-04 04:58:53

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

由于尚未支持原生GeoQueries,我想到了一个可能的解决方案,但想知道它的有效性和有效性。

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

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

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

1 个答案:

答案 0 :(得分: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翻译