[英]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.