Справочная информация: Я получаю длинный и лат как параметры для веб-службы. Обычно они составляют до шести знаков после запятой. Когда новый запрос получен, я вычисляю расстояние между последним записанным loc и long/lat в параметрах запроса. Если расстояние больше определенного порогового расстояния в милях друг от друга, я обновляю текущий loc.Расчеты с плавающей запятой с широтами и долготами различной точности
Проблема: Я использую geokit gem/plugin для расчета расстояния между местоположениями. Очень редко появляется ошибка (ошибка на нулевом расстоянии, упомянутая на сайте автора - я использую 1.4.1, который утверждает, что ошибка исправлена, но я все еще вижу, что это происходит shrug), что заставляет вычислять расстояние, чтобы вернуть что-то дико неточно при расчете расстояния между двумя точками, которые идентичны (это происходит, если пользователь не перемещается). Это вызывает обновление текущего местоположения пользователя, которое не должно происходить. Вам, наверное, интересно - хорошо, если просто обновить loc, чтобы быть точно такими же координатами, кого это волнует? Ну, ответ заключается в том, что куча другого дерьма возникает, когда loc обновляется, что делает его актуальной проблемой.
Попытка Решение: Я попытался добавить логику, чтобы вручную проверить, идентичны ли эти два источника перед вычислением расстояния, а затем просто пропустить вычет и не обновлять, если это так. Входящие параметры являются длинными/латами с 6 десятичной точностью; тогда как в моей базе данных я сохраняю значения как float, которые, как представляется, хранят только 4 десятичных знака. Это приводит к тому, что мое сравнение с плавающей точкой всегда терпит неудачу, и неудовлетворительные обновления локаторов продолжают возникать.
Фу, хорошо, поэтому на самом деле возникает вопрос: как мне выполнить это сравнение? Должен ли я обрезать 2 десятичных разряда из входящих лат/длин, округлить так или иначе, чтобы четвертая цифра была правильной, а затем сравнима? Или, следует ли сравнивать «в определенном диапазоне» (например, сообщено_loc.long> current_loc.long - .0001 & & сообщено_loc.long < current_loc.long + .0001)? Также были бы высоко оценены любые рекомендации для существующего рубинового драгоценного камня/плагинов или встроенные функции для такого рода вещей.
Вот пример вывода из журнала:
[update_loc] Last location history record at lat: 41.5024, long: -81.6816
[update_loc] Current loc at lat: 41.502467, long: -81.681623
[update_loc] Distance from current loc and last loc history: 5795.10615113555 miles
[update_loc] Locs not identical and distance greater than threshold, inserting new loc history
[update_loc] Location update complete
Спасибо вам
Том