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 地理查询的主要内容,如果未能解决你的问题,请参考以下文章

颤动的firestore地理点未显示为标记

Flutter Firestore 复合查询

用于列表构建的 Flutter 中的 Firestore 嵌套查询

使用 Flutter 的 Firestore 组集合查询

Flutter:按时间戳查询 Firestore 文档

Flutter 和 Firestore 基于位置的查询和数据结构