gpt4 book ai didi

java - Firestore - 可能的 GeoQuery 解决方法

转载 作者:行者123 更新时间:2023-11-30 06:08:50 25 4
gpt4 key购买 nike

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

我想要的:我收集了大约 2000 个文档,每个文档都包含一个地理点。例如,我想查询距用户当前位置最近的 20 个文档。

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

编辑:已尝试我的建议。遇到不断的问题后放弃了。我让整个索引文档正常工作,并且能够下载它,安排它以找到最近的位置和相关的文档 ID。然而,我在使用文档 ID 数组来设置监听器时遇到了很多问题。我使用 for 循环来遍历数组中的每个 ID,并为每个 ID 设置一个监听器,但它只执行第一个,并且随机崩溃不断发生。我还注意到获取文档花了相当长的时间......因此,我决定放弃高精度解决方案,只查询地理点以查找用户周围正方形内的位置。

最佳答案

我认为最简单的方法是使用 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 翻译。 .

关于java - Firestore - 可能的 GeoQuery 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50673639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com