Расчет будущей позиции - PullRequest
4 голосов
/ 20 мая 2011

У меня есть информация об объекте:

Lat / Long Position Заголовок (в радианах) Скорость (в узлах)

Как рассчитать, где позиция широты / долготы будет находиться в произвольный момент времени (или вычислять его позицию с интервалами), если предположить, что сущность движется по прямой линии с постоянной скоростью на постоянной высоте?

(Как вы можете сказать, мои математические навыки слабы)

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Во-первых, вы не можете двигаться по прямой и в то же время на постоянной высоте. Ваши координаты широты / долготы находятся над эталонным эллипсоидом (скорее всего, WGS84). Это различные библиотеки или расширения БД, которые имеют множество функций для решения именно таких проблем. Postgis, например, является одним из них. Большинство из них бесплатны и протестированы и работают. Я бы не рекомендовал пытаться реализовать это самостоятельно (предполагая, что Земля является идеальной сферой с радиусом r), ​​так как вы должны учитывать эталонный эллипсоид, который вы используете.

1 голос
/ 25 мая 2011

Принимая во внимание ответ, предоставленный Гипербореем, здесь есть формула авиации: http://williams.best.vwh.net/avform.htm, в которой есть формулы для расчета нового широты / долготы с учетом начальной точки, угла и расстояния.Вы должны рассчитать расстояние самостоятельно.Похоже, у вас есть все, что вам нужно для расчета расстояния, поскольку скорость - это просто расстояние / время, и если вы умножите это на смещение времени, которое вы хотите использовать, вы получите свое расстояние.

1 узел = 1 миль / час расстояние = yourTimeInDecimalHours * speed;

пример кода, иллюстрирующий это (скопировано из ссылки, указанной выше):

double lat1 = 0, lon1 = 0;                      // NOTE: these are in radians - remember PI/2 radians = 90 degrees
double d = timeInDecimalHours * speedInKnots;   // so a half hour at 35 knots would be .5 * 35
double tc = usersTrueCourse;                    // aka user's heading
double lat=                                     // this will be in radians!!
    Math.asin(
        Math.sin(lat1) 
        * Math.cos(d)
        + Math.cos(lat1)
        * Math.sin(d)
        * Math.cos(tc)
    );
double lon = 0;
if (Math.cos(lat) == 0) {
    lon = lon1      // endpoint a pole
} else {
    lon = (lon1 - Math.asin(Math.sin(tc)*Math.sin(d)/Math.cos(lat)) + Math.PI % (2*Math.PI))-Math.PI;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...