Вычисления с плавающей точкой с широтой и долготой различной точности - PullRequest
2 голосов
/ 24 августа 2009

Фон: Я получаю long и lat в качестве параметров для веб-службы. Обычно они имеют до 6 десятичных знаков. Когда новый запрос получен, я вычисляю расстояние между последним записанным loc и long / lat в параметрах запроса. Если расстояние больше определенного порога в милях друг от друга, я обновляю текущее местоположение.

Проблема: Я использую geokit gemit / plugin для вычисления расстояния между локациями. Очень редко обнаруживается ошибка (ошибка нулевого расстояния, упомянутая на сайте автора - я использую 1.4.1, которая утверждает, что ошибка исправлена, но я все еще вижу, что это происходит shrug ), которая вызывает расстояние calc вычисляет что-то крайне неточное при расчете расстояния между двумя точками, которые идентичны (это происходит, если пользователь не двигается). Это вызывает обновления текущего местоположения пользователя, что не должно происходить. Вы, наверное, задаетесь вопросом - ну, если это просто обновляет loc, чтобы она была точно такой же координаты, кого это волнует? Что ж, ответ таков: при обновлении loc возникает куча других дерьмов, что делает ее актуальной проблемой.

Попытка решения: Я попытался добавить в логику, чтобы вручную проверить, идентичны ли два локса, прежде чем вычислять расстояние, а затем просто пропустить расчет и не обновлять, если это так. Входящие параметры: long / lats с точностью до 6 десятичных знаков; в то время как в моей базе данных я храню значения как числа с плавающей запятой, которые, по-видимому, хранят только 4 десятичных знака. Это приводит к тому, что мое сравнение с плавающей точкой всегда завершается ошибкой, и продолжают появляться неподходящие обновления loc.

Фу, хорошо, так что реальный вопрос: как мне провести это сравнение? Должен ли я усечь 2 десятичных знака из входящих лат / длин, как-то округлить, чтобы четвертая цифра была правильной, а затем сравнить? Или я должен выполнить сравнение «в определенном диапазоне» (например, reports_loc.long> current_loc.long - .0001 && reports_loc.long

Вот пример вывода из журнала:

[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

Спасибо

Tom

Ответы [ 2 ]

3 голосов
/ 24 августа 2009

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

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

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

2 голосов
/ 24 августа 2009

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

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

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

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

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

...