由于尚未支持原生GeoQueries,我想到了一个可能的解决方案,但想知道它的有效性和有效性。
我想要的是什么:我有大约2000个文档的集合,每个文档都包含一个Geopoint。 我想查询例如最近的20个文档到用户当前位置。
可能的解决方案:我可以在集合中创建另一个文档,并将其作为我的“索引”。每个字段名称都是每个文档ID的字符串。每个字段的值将是相应的Geopoint。 然后,当应用程序打开时,我只需要1次读取操作...然后我可以使用函数来处理2000个文档字段来计算和排序每个位置与用户的距离吗?最后,我可以获得最接近的20个结果,然后只创建一个监听器并仅拉出那些结果吗?
编辑:尝试了我的建议。遇到不断的问题后放弃。 我得到了整个索引文档,并且能够下载它,安排它找到最近的位置和相关的文档ID。但是,使用doc ID数组来设置监听器时遇到了很多问题。我使用for循环来遍历数组中的每个ID并为每个ID设置一个监听器,但它只执行了第一个并且随机崩溃不断发生。另外我注意到获得文档需要花费更长的时间......所以,我决定放弃高精度解决方案,只是查询地理位置以找到用户周围广场内的位置。
答案 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翻译