8

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

  • последние сообщил широта, долгота ж/метки времени
  • цель широта, долгота
  • расчетного времени целевого
  • заголовка

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

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

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

Целевая платформа - приложение Google Maps, поэтому у меня есть некоторые базовые функции, такие как функция Geo-correct для расстояния между двумя координатами. Язык незначителен, поскольку я знаю много, и при необходимости может переносить или адаптировать любые примеры. Однако предпочтительными были бы общие решения.


Это просто два независимых векторных расчета?

 
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 

ответ

8
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) 

Самое сложное во всем этом сохранить единицы в порядке.

(*) несколько соображений относительно того, является ли это нормально считать линейной прогрессии ...
Очевидно, что специфика реальности физических элементов (морских течений, ветра, видимость ...) может иметь большее значение в этом вопросе, чем геопространственная математика.
Предполагая, что транспортное средство движется с постоянной скоростью, в прямой линии, это ] ok предположить линейность в измерении широты [хорошо технически земля не является точно сферой, это не совсем верно, но проклятье Закрыть]. Однако на более длинных расстояниях, которые включают относительно большое изменение широты, угловая прогрессия вдоль долготы не линейна. Причина этого в том, что при удалении от экватора степень долготы, выраженная в линейных милях (или километрах ...), уменьшается. В следующей таблице должна дать примерное представление об этом эффекте, для расположения на разных широтах:

 
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   

Смотрите эту handy online calculator, чтобы вычислить это для определенной широты.
Другой способ получить представление об этом - увидеть, что путешествие из-за востока (или запада) в широте Джексонвиля, Флориды или Сан-Диего, штат Калифорния, занимает 52 мили для покрытия долготы; на широте Монреаля или Сиэтла, он занимает всего 40 миль.

+0

Извините, я не получил уведомление о вашем ответе, пока добавлял свой комментарий. Я думаю, что мы оба говорим то же самое ... Я соглашусь на ваш ответ после пары upvotes, чтобы поддержать его ;-) –

+0

@Mark R, извините, сам, я не видел формулы, которые вы добавили к своему вопросу или. Я вижу, вы слишком полагаете, что можете использовать обычную линейную экстраполяцию. См. Мои изменения в отношении этого предположения. – mjv

+0

Я думаю, потому что у меня уже есть расчетное время (которое мы можем считать правильным, если нет аномалий), который удаляет геопространственный аспект из уравнения справа? Я интерполирую со временем, чтобы найти позицию, не пытаясь рассчитать время. –

14

Вы хотите использовать 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) 

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