簡體   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