繁体   English   中英

使用计算字段订购 QuerySnapShot

[英]Ordering QuerySnapShot with calculated field

我正在获取一个 Firestore 集合作为 QuerySnapShot。

 List userDocs = snapShot.data!.docs;

userDocs 有一个 GeoPoint 值,我正在计算从当前用户位置到每个 userDocs GeoPoint 项目的距离。

我可以使用函数计算距离,但我需要将计算出的距离添加为 userDocs 的一部分,以便我可以对 userDocs 项目从最近到最远进行排序。

在这里你有我的尝试:

 List userDocs = snapShot.data!.docs;
          String distKm ="";
          //iterate para calcular la distancia al spot
          int i = 0;
          userDocs.forEach((e) {
            print("loop ${i}");
            print(e['spot_id']);
            //calculamos distancia
            GeoPoint geoPoint = e['location'];
            var latPost = geoPoint.latitude;
            var lonPost = geoPoint.longitude;
            var distancia = calculateDistance(
                widget.latitud, widget.longitud, latPost, lonPost);
            print("distancia  ${distancia}");
            distKm = distancia.toStringAsFixed(2);
            print("distkm ${distKm}");
            //update item in userDocs
            i++;
          });

有什么方法可以将新项目添加到 userDocs 或更新现有的(键,值)以便能够对 userDocs 进行排序以获得最近到最远的项目?

编辑

计算距离的函数:

  double calculateDistance(lat1, lon1, lat2, lon2) {
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 -
        c((lat2 - lat1) * p) / 2 +
        c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
  }

Firestore 没有用于基于距离的过滤的内置运算符,它只能对存储在它返回的文档中的值进行排序/过滤。

如果您在编写文档时知道这两个位置的纬度/经度对,那么您确实还可以添加一个字段,其中包含您基于该距离计算的距离,然后在查询中使用该字段。

如果在写入时不知道其中任何一个位置,则这不是一个选项。 那时您唯一的选择是使用基于 geohash(或类似)的查询,如geoqueries上的 Firebase 文档中所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM