我建议计算与用户经度 10 公里距离对应的最小和最大经度。您对纬度执行相同操作并在 Firestore 查询中使用这些限制。这样做您将有更少的事件/读取,并且您可以计算精确的距离以抑制 10 到 14 公里半径之间的事件......如果需要。
要计算您的限制,您可以使用https://www.movable-type.co.uk/scripts/latlong.html 中的以下公式(目标点给定距离和距起点的方位),还有一个在线 javascript 计算器可供您学习。
φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )
其中φ是纬度,λ是经度,θ是方位角(从北顺时针方向),δ是角距离d/R; d 是以米为单位的距离,R 是地球的半径 (6371e3)。
方位角为 0°,您将获得 LatitudeMax
方位角为 90°,您获得经度东
方位角为 180°,您将获得 LatitudeMin
方位角为 270°,您获得西经
因为地球是一个经度介于-180°和180°之间的球体
longitudeMin = Min(longitudeEast, longitudeWest)
longitudeMax = Max(longitudeEast, longitudeWest)
Firestore 部分是这样的:
CollectionReference col = Firestore.instance.collection("mycollection");
Query latitudeMinQuery = col.where('latitude', isGreaterThan: LatitudeMin);
Query latitudeMaxQuery = latitudeMinQuery.where('latitude', isLessThan: LatitudeMin);
Query longitudeMinQuery = latitudeMaxQuery.where('longitude', isGreaterThan: LongitudeMin);
Query longitudeMaxQuery = longitudeMinQuery.where('latitude', isLessThan: LongitudeMax);