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