java - Firestore - 可能的 GeoQuery 解决方法
问题描述
由于尚不支持本地地理查询,我想到了一个可能的解决方案,但想知道它的有效性和有效性。
我想要什么:我收集了大约 2000 个文档,每个文档都包含一个 Geopoint。例如,我想查询离用户当前位置最近的 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 在这篇文章中编写的代码的 Kotlin 翻译。
推荐阅读
- javascript - 将 enter keydown 视为跨多个模式按下“下一步”按钮
- c# - Rebus - 在 ASP.NET Core 中订阅事件
- arrays - 有没有更简单的方法在 Go 中解码这个 json?
- javascript - 如何自定义 Bootstrap 4 的 JavaScript 文件
- php - 如何将此 API 日期格式转换为 PHP 日期?
- react-native - Crypto JS 在生产模式下未正确加密
- javascript - 通过 Webpack 缩小保留单个 JavaScript 变量名
- python - 在没有凭据的情况下使用 boto3 (python) 访问 S3?
- c++ - 用抽象类覆盖模板函数
- python - 使用python使用递归打印星号