Я предлагаю рассчитать минимальную и максимальную долготу, соответствующие расстоянию в 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);