2009-08-24 7 views
2

Справочная информация: Я получаю длинный и лат как параметры для веб-службы. Обычно они составляют до шести знаков после запятой. Когда новый запрос получен, я вычисляю расстояние между последним записанным 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 

Спасибо вам

Том

ответ

3

Обычный способ проверить, если два числа близко использовать abs, т.е.

(reported_loc.long - current_loc.long).abs <= tol 

где tol некоторые заранее заданного допуска, например, 0.0001.

2

GPS-приемник может дать вам место с точностью до многих знаков после запятой, но это не означает, что измерение на самом деле точный.

Обычно около 95% измерений лежат в пределах круга метров, что примерно одинаково точно для хранения с 32-битным поплавком.

Тем не менее, вы четко заметите ошибки округления, когда вы строите gps-журнал как поплавки на карте.

В любом случае, чтобы сделать это сравнение, я бы использовал диапазон вместо округления входящего значения и сравнения его с значением базы данных. Вы больше не сможете обнаружить самые маленькие движения, но по крайней мере вы больше не получите ложных срабатываний.

Поскольку вы используете поплавки для хранения вещей, вы, очевидно, не заботитесь о миллиметрах или сантиметрах.

Смежные вопросы