如何在不查询数据库中所有点的情况下从 Firestore 获取地图上的附近点
How can I get nearby points on map from Firestore without querying all the points in the database
我在数据库中存储了很多位置(纬度和经度)。我正在使用 Firestore。我在地图上有一个点(纬度和经度),我只想从数据库中获取距离指定点最大 ~50m 的位置。
一种方法是获取数据库中的所有位置,然后遍历它们,select 只获取足够近的位置,但我担心获取数据库中的所有位置并遍历他们太费时间了。
我考虑过的另一种方法是进行数据库查询,其中包含距离函数(非常复杂),但 firestore 查询仅使用简单的函数(等于、> 等),这也是不可能的将 lambda 函数传递给查询。
执行此操作的第三种方法也是我能看到的最好的方法是将地球划分为小正方形。正方形类似于从纬度 X 到(纬度 X + 5')和经度 Y 到(经度 Y + 5')的区域。为了在 Firestore 数据库中创建这些正方形,我会这样做:一个包含文档的集合 'locationBuckets',每个文档代表一个正方形并且文档 ID 等于 '${X_latitude}-$ {Y_longitude}'。代表一个正方形的每个文档都将包含一个集合,其中一个文档代表该正方形中的每个位置。因此,为了让附近的位置首先到达一个点,我会得到点所在的桶,然后我会得到桶中的所有位置并过滤它们。查询将如下所示:
admin.firestore().collection("locationBuckets").doc(${X_latitude}-${Y_longitude}).collection('exactLocations').get().
我的问题是:第三种查询方式性能好吗?
谢谢!
编辑:第一个评论的解决方案是 firebase.google。com/docs/firestore/solutions/geoqueries。
作为 Firestore 文档的一部分,可以在此处找到一篇名为 Geoqueries 的文章:
https://firebase.google.com/docs/firestore/solutions/geoqueries
请查看该文章,看看它是否解决了这个问题。总结:
Geohash is a system for encoding a (latitude, longitude) pair into a single Base32 string. In the Geohash system the world is divided into a rectangular grid. Each character of a Geohash string specifies one of 32 subdivisions of the prefix hash
我在数据库中存储了很多位置(纬度和经度)。我正在使用 Firestore。我在地图上有一个点(纬度和经度),我只想从数据库中获取距离指定点最大 ~50m 的位置。
一种方法是获取数据库中的所有位置,然后遍历它们,select 只获取足够近的位置,但我担心获取数据库中的所有位置并遍历他们太费时间了。
我考虑过的另一种方法是进行数据库查询,其中包含距离函数(非常复杂),但 firestore 查询仅使用简单的函数(等于、> 等),这也是不可能的将 lambda 函数传递给查询。
执行此操作的第三种方法也是我能看到的最好的方法是将地球划分为小正方形。正方形类似于从纬度 X 到(纬度 X + 5')和经度 Y 到(经度 Y + 5')的区域。为了在 Firestore 数据库中创建这些正方形,我会这样做:一个包含文档的集合 'locationBuckets',每个文档代表一个正方形并且文档 ID 等于 '${X_latitude}-$ {Y_longitude}'。代表一个正方形的每个文档都将包含一个集合,其中一个文档代表该正方形中的每个位置。因此,为了让附近的位置首先到达一个点,我会得到点所在的桶,然后我会得到桶中的所有位置并过滤它们。查询将如下所示:
admin.firestore().collection("locationBuckets").doc(${X_latitude}-${Y_longitude}).collection('exactLocations').get().
我的问题是:第三种查询方式性能好吗?
谢谢!
编辑:第一个评论的解决方案是 firebase.google。com/docs/firestore/solutions/geoqueries。
作为 Firestore 文档的一部分,可以在此处找到一篇名为 Geoqueries 的文章:
https://firebase.google.com/docs/firestore/solutions/geoqueries
请查看该文章,看看它是否解决了这个问题。总结:
Geohash is a system for encoding a (latitude, longitude) pair into a single Base32 string. In the Geohash system the world is divided into a rectangular grid. Each character of a Geohash string specifies one of 32 subdivisions of the prefix hash