Расчеты GPS / ГИС: алгоритм прогнозирования будущего положения на основе движения / миль / ч? - PullRequest
8 голосов
/ 05 февраля 2011

В поисках ресурсов или алгоритма для расчета следующего в навигационном приложении:

Если моя текущая позиция GPS равна (0,0), и я направляюсь на 32 градуса со скоростью 15 миль в час, как я могупосчитать, какая моя позиция будет через 10 секунд?

т.е.: GPSCoordinate predictedCoord = GPSCoordinate.FromLatLong(0, 0).AddByMovement(32, 15, TimeSpan.FromSeconds(10));

Редактировать: Текущий код на основе ответа ниже:

public GPSCoordinate AddMovementMilesPerHour(double heading, double speedMph, TimeSpan duration)
{
    double x = speedMph * System.Math.Sin(heading * pi / 180) * duration.TotalSeconds / 3600;
    double y = speedMph * System.Math.Cos(heading * pi / 180) * duration.TotalSeconds / 3600;

    double newLat = this.Latitude + 180 / pi * y / earthRadius;
    double newLong = this.Longitude + 180 / pi / System.Math.Sin(this.Latitude * pi / 180) * x / earthRadius;

    return GPSCoordinate.FromLatLong(newLat, newLong);
}

Ответы [ 2 ]

10 голосов
/ 06 февраля 2011

Вот полный параметрический ответ:

переменные:

  • heading: курс (то есть угол назад от азимута 0 ° в градусах)
  • speed: скорость (то есть норма вектора скорости, в милях / час)
  • lat0, lon0: начальные координаты в градусах
  • dtime: интервал времени отначальная позиция, в секундах
  • lat, lon: прогнозируемые координаты в градусах
  • pi: постоянная pi (3.14159 ...)
  • Rt: радиус Земли в миль (6378137.0 метров, что составляет 3964.037911746 миль)

В (восточном, северном) локальном кадре положение после времениинтервал:

x = speed * sin(heading*pi/180) * dtime / 3600;
y = speed * cos(heading*pi/180) * dtime / 3600;

(с координатами в милях)

Оттуда вы можете вычислить новую позицию в кадре WGS84 (т. е. широту и долготу):

lat = lat0 + 180 / pi * y / Rt;
lon = lon0 + 180 / pi / sin(lat0*pi/180) * x / Rt;

Редактировать: исправил последнюю строку: * грех (фи) в / грех (фи)

0 голосов
/ 06 февраля 2011

Вот формулы, которые вам нужны.

http://www.movable -type.co.uk / scripts / latlong.html

Надеюсь, что поможет.

Боб

[обновить] Вот формулы в JavaScript (скопировано из источника)

var lat2 = Math.asin (Math.sin (lat1) * Math.cos (d)/ R) + Math.cos (lat1) * Math.sin (d / R) * Math.cos (brng));var lon2 = lon1 + Math.atan2 (Math.sin (brng) * Math.sin (d / R) * Math.cos (lat1), Math.cos (d / R) -Math.sin (lat1) * Math.sin (lat2));

d = пройденное расстояние = скорость x время R = радиус Земли

...