Flutter Firestore 地理查询
Posted
技术标签:
【中文标题】Flutter Firestore 地理查询【英文标题】:Flutter Firestore Geo query 【发布时间】:2019-11-02 14:16:45 【问题描述】:我必须做什么:
我正在构建一个应用程序,我想在 firebase 中进行查询并接收 X 公里范围内的用户。
但我想限制收到的文件,并有一个功能可以在卷轴上获取更多文件。我正在使用StreamBuilder->ListView.build
来构建我的列表。当我要收到可滚动列表的末尾时,我想从 Firestore 获取更多文档(如果有的话)。
我已经做了什么:
到目前为止,我只找到了 2 个解决我的问题的方法:
-
Firestore Helpers
GeoFlutterFire
问题:
这两个库都很好,只有一个 BIG 问题,在这两种情况下,我都无法限制我将要接收的文档数量(我可以 只是限制 Firestore.instance.collection("MyColection")
) 的原始查询,但对我没有太大帮助,因为我会遇到这种情况
给我 10 个来自 Firestore 的文档 -> 给我 5 公里范围的用户 -> 比方说,我只会收到 4 个。
我想要的是在 X 范围内从 Firestore 接收 10 个文档。
这个问题有什么解决办法吗?或者我需要为此实现我自己的库?还是连这样都不可能?
【问题讨论】:
你是如何解决这个问题的?我面临集成相同功能的困难.. 我没有。在一天结束时,我放弃了 Firestore,我使用了 ParseServer,它已经实现了这个功能,而且不仅仅是开源。另外,如果您有兴趣,我正在使用这个back4app.com 感谢您的回复,但从 firebase 迁移对我来说不是一个简单的解决方案。我会尝试以某种方式实现该功能。那么下面的答案呢? 【参考方案1】:GeoPoint userGeoPoint = user.geoPoint["geopoint"];
// 距离以英里为单位 双倍距离 = 30;
double lat = 0.0144927536231884;
double lon = 0.0181818181818182;
double lowerLat = userGeoPoint.latitude - (lat * distance);
double lowerLon = userGeoPoint.longitude - (lon * distance);
double greaterLat = userGeoPint.latitude + (lat * distance);
double greaterLon = userGeoPint.longitude + (lon * distance);
GeoPoint lesserGeopoint = GeoPoint(lowerLat, lowerLon);
GeoPoint greaterGeopoint = GeoPoint(greaterLat, greaterLon);
Query query = Firestore.instance
.collection(path)
.where("geoPoint.geopoint", isGreaterThan: lesserGeopoint)
.where("geoPoint.geopoint", isLessThan: greaterGeopoint)
.limit(limit);
这对我有用。希望对您有所帮助。
【讨论】:
【参考方案2】:有点晚了,但我遇到了同样的问题,我决定构建一个具有距离排序和限制功能的外部服务器。服务器存储包含地理点和 Firestore 文档 ID 的对象。
-
客户端向服务器发送一个请求,带有中心点和半径。
服务器返回文档 ID 列表。
根据提供的 ID 从 Firestore 获取文档。
我想出的最好的。
【讨论】:
以上是关于Flutter Firestore 地理查询的主要内容,如果未能解决你的问题,请参考以下文章