Как с помощью линейной интерполяции оценить текущее положение между двумя Гео координатами?
У меня есть следующие доступные:
- последнее сообщение lat, lon w / timestamp
- цель лат, Лон
- расчетное время до цели
- заголовок
Как я могу интерполировать оцененное положение во времени?
Я знаю, что этого достаточно, чтобы вычислить необходимую среднюю скорость для оставшейся части поездки. Учитывая расстояние по прямой, это довольно тривиально. Я знаю, что это связано с векторами, но я немного заржавел и подумал, что лучше проконсультироваться с некоторыми экспертный.Причина, по которой мне нужна эта частота обновления, ограничена, поэтому, чтобы показать плавную анимацию, мне нужно угадать текущее положение между обновлениями.
Целевая платформа-это приложение Google Maps, поэтому у меня есть некоторые базовые функции, такие как функция Геокоррекции расстояния между двумя координатами. Язык не имеет значения, поскольку я знаю многих и могу перенести или адаптировать любые примеры, если это необходимо. Однако предпочтительными были бы общие решения.Это просто два независимые векторные вычисления?
latestimate = latstart + (Δlat * P) lonestimate = lonstart + (Δlon * P) Where: testimated = the reported estimated time to target telapsed = time since last time estimate P = telapsed / testimated Δlat = latreported - lattarget Δlon = lonreported - lontarget
2 ответа:
Lat_to_Travel = CurLat - TargetLat Long_to_Travel = CurLong - TargetLong Time_to_Travel = ETA - now
Если расстояния относительно малы, то, вероятно, нормально предположить линейную прогрессию по этим трем измерениям (*). Затем вам нужно выбрать число промежуточных позиций для отображения, скажем, 10, и вычислить каждую промежуточную точку соответственно
NbOfIntermediates = 10 // for example Lat_at_Intermediate(n) = CurLat + (1/NbOfIntermediates * Lat_to_travel) Long_at_Intermediate(n) = CurLong + (1/NbOfIntermediates * Long_to_travel) Time_at_Intermediate(n) = now + (1/NbOfIntermediates * Time_to_travel)
Самое сложное во всем этом-держать блоки в порядке.
( * ) несколько соображений относительно того, допустимо ли предполагать линейную прогрессию...
Очевидно, что специфика реальность физических элементов (морские течения, ветер, видимость...) может иметь большее значение в этом вопросе, чем гео-пространственная математика.
предполагая, что транспортное средство движется с постоянной скоростью, по прямой линии, это [В общем случае] хорошо предположить линейность в широтном измерении [Ну технически земля не является точно сферой это не совсем верно, но чертовски близко]. Однако на больших расстояниях, включающих относительно большое изменение широты, угловое прогрессия вдоль измерения долготы не линейна. Причина этого заключается в том, что по мере удаления от экватора градус долготы выражается в линейных милях (или километрах...) снизит. Следующая таблица должна дать приблизительное представление об этом эффекте для мест на различных широтах:Latitude Length of a Degree Approximate examples (of longitude) in nautical miles 0 60 Kuala Lumpur, Bogota, Nairobi 20 56.5 Mexico city, Mecca, Mumbai, Rio de Janeiro 45 42.5 Geneva, Boston, Seattle, Beijing, Wellington (NZ) 60 30 Oslo, Stockholm, Anchorage AK, St Petersburg RussiaСмотрите это удобный онлайн калькулятор чтобы вычислить это для определенной широты.
Другой способ получить представление об этом-увидеть, что путешествие на восток (или Запад) в конце Джексонвилля, Флорида, или Сан-Диего, Калифорния, требуется 52 мили, чтобы покрыть градус долготы; на широте Монреаля или Сиэтла требуется всего 40 миль.
Вы хотите использовать Slerp, или сферическую линейную интерполяцию.
Преобразуйте широту и долготу в единицу 3-вектора:
p=(x,y,z)=(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))
Тогда "Slerp" дает интерполяцию постоянной скорости вдоль поверхности единичной сферы:
Обратите внимание, что если тэта очень близка к 0 или 180 градусам, эта формула может быть численно неустойчивой. В случае малого угла вы можете вернуться к линейной интерполяции; в случае 180 градусов ваш путь действительно двусмысленный.theta= angle between 3-vectors p0 and p1 (e.g., cos(theta)= p0.p1) Slerp(p0,p1,t)= ( p0*sin((1-t)*theta) + p1*sin(t*theta) ) / sin(theta)