Как использовать линейную интерполяцию для оценки текущей позиции между двумя геокоординатами?

У меня есть в наличии следующее:

  • последняя зарегистрированная широта, долгота с отметкой времени
  • целевая широта, долгота
  • предполагаемое время достижения цели
  • Заголовок

Как я могу интерполировать расчетное положение с течением времени?

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

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

Целевой платформой является приложение 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

person Mark Renouf    schedule 15.11.2009    source источник


Ответы (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 миль.

person mjv    schedule 15.11.2009
comment
Извините, я не получил уведомление о вашем ответе, пока добавлял свой комментарий. Я думаю, что мы оба говорим об одном и том же... Я приму ваш ответ после пары голосов, чтобы поддержать его ;-) - person Mark Renouf; 16.11.2009
comment
@Mark R, извините, я тоже не видел формул, которые вы добавили к своему вопросу. Я вижу, вы слишком предполагаете, что можете использовать простую линейную экстраполяцию. Смотрите мои правки относительно этого предположения. - person mjv; 16.11.2009
comment
Я думаю, потому что у меня уже есть расчетное время (которое, как мы можем предположить, верное, если нет аномалий), которое удаляет геопространственный аспект из уравнения, верно? Я интерполирую по времени, чтобы найти положение, а не пытаюсь рассчитать время. - person Mark Renouf; 16.11.2009
comment
@Mark R, не совсем так... [извините]. Давайте возьмем [слегка надуманный] пример: самолет из Майами предполагает, что он будет в Сиэтле через 5 часов. Если бы вы нарисовали линию прогресса с помощью линейной интерполяции, вы бы показали, что самолет продвигается на запад в течение первого часа так же, как и в последний. Однако кратчайший маршрут самолета должен быть таким, чтобы он делал немного севернее в ранние часы и немного западнее в более поздние часы. (фактически самолет, вероятно, будет летать по более сложным маршрутам с несколькими поворотами как из-за политики маршрутизации FAA, так и из-за того, что... - person mjv; 16.11.2009
comment
... различные погодные условия, в частности расположение струйного течения.) В двух словах, линейная интерполяция обеспечивает хорошее приближение к прогнозируемому пути транспортного средства, но она может быть ошибочной, если путешествие включает значительную разницу в широте. Поскольку на самом деле ни одно транспортное средство не движется [в течение длительного времени] ни по прямой линии, ни по большому кругу, это приближение может быть приемлемым. Если перед вами стоит задача дать точную оценку любой из этих воображаемых линий, применяемые формулы будут отличаться. - person mjv; 16.11.2009

Вы хотите использовать Slerp или сферическую линейную интерполяцию.

Преобразуйте вашу широту и долготу в единичный 3-вектор:

p=(x,y,z)=(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

Затем «Slerp» дает вам интерполяцию с постоянной скоростью вдоль поверхности единичной сферы:

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)

Обратите внимание, что если тета очень близка к 0 или 180 градусам, эта формула может быть численно нестабильной. В случае малого угла вы можете вернуться к линейной интерполяции; в случае 180 градусов ваш путь действительно неоднозначен.

person comingstorm    schedule 16.11.2009