Является ли местоположение GPS между двумя местоположениями

Я работаю над проектом, который будет отслеживать движение автомобиля. Местоположение автомобиля берется из Geoloqi API и отображается на карте, которая автоматически обновляется. Координаты передаются функции AHAH в Drupal, которая загружает дополнительную информацию о позиции через некоторые другие API: Одним из них является Geonames.org.

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

Geonames дает строку GPS-местоположений для текущей улицы, чтобы ее можно было нарисовать на карте. «Линия» отдана следующему перекрестку. Мы бы съели наши билеты слишком быстро, если бы запрашивали текущее название улицы каждый раз, когда меняется местоположение, но как насчет каждого перекрестка?

Можно ли в PHP проверить, находится ли данная координата GPS на линии между двумя другими координатами? Также было бы хорошо, если бы эту линию можно было продлить на несколько метров во всех направлениях, чтобы убрать любое смещение.

Большое спасибо за все предложения.


person Fredrik Jonsson    schedule 03.07.2012    source источник


Ответы (1)


Ваш первоначальный вопрос сводится к простой математической задаче: найти уравнение прямой с учетом двух точек, через которые она проходит. Эта часть проста: скажем, у вас есть две точки с координатами (lat1, lon1) и (lat2, lon2), тогда уравнение прямой будет

(lon2 - lon1) * X + (lat1 - lat2) * Y + (lat1 * lon2 + lat2 * lon1) = 0

Теперь, когда вы получите любую другую точку (широта, долгота), просто поместите эти координаты как (X, Y) соответственно в уравнение. Если вы получите 0, то точка находится на линии. Затем убедитесь, что ваш lat находится между lat1 и lat2, а ваш lon находится между lon1 и lon2. Если да, то новая точка находится на линии между двумя существующими точками.

Более сложная часть связана с двумя вещами:

  1. Ошибка GPS. Чтобы учесть это, вы можете сделать некоторое приближение, например, вместо сравнения с 0, дать ему некоторую свободу действий, например. сравните от -err до +err, где err — это некоторое значение, которое вы бы определили.

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

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

person Aleks G    schedule 03.07.2012