Вычисление расстояния и курса между двумя координатами - PullRequest
3 голосов
/ 19 июня 2011

У меня есть 2 координаты, и я хотел бы сделать что-то на первый взгляд. Я хочу выяснить, учитывая:

1) Координата А 2) Курс, предоставляемый Core Location 3) Координата B

следующее:

1) Расстояние между A и B (в настоящее время может быть сделано с помощью distanceFromLocation), так что хорошо на этом. 2) Курс, который нужно пройти, чтобы добраться от А до Б (отличается от курса, который в настоящее время путешествует)

Есть ли простой способ сделать это, любой сторонний или встроенный API?

Apple, кажется, не предоставляет это, но я могу ошибаться.

Спасибо, ~ Arash

EDIT:

Спасибо за быстрые ответы, я полагаю, что, возможно, произошла некоторая путаница, я рассчитываю получить курс (ориентируясь от точки а к точке b в градусах, так что 0 градусов = север, 90 градусов = восток, аналогично возврат значения курса по CLLocation. Не пытаться вычислить фактический поворот по направлениям поворота.

Ответы [ 4 ]

4 голосов
/ 19 июня 2011

У меня есть код на github, который делает это.Взгляните на заголовок InRadians здесь .Он основан на сферическом законе косинусов.Я вывел код из алгоритма на этой странице .

/*-------------------------------------------------------------------------
* Given two lat/lon points on earth, calculates the heading
* from lat1/lon1 to lat2/lon2.
*
* lat/lon params in radians
* result in radians
*-------------------------------------------------------------------------*/
double headingInRadians(double lat1, double lon1, double lat2, double lon2)
{
    //-------------------------------------------------------------------------
    // Algorithm found at http://www.movable-type.co.uk/scripts/latlong.html
    //
    // Spherical Law of Cosines
    //
    // Formula: θ = atan2( sin(Δlong) * cos(lat2),
    // cos(lat1) * sin(lat2) − sin(lat1) * cos(lat2) * cos(Δlong) )
    // JavaScript:
    //
    // var y = Math.sin(dLon) * Math.cos(lat2);
    // var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
    // var brng = Math.atan2(y, x).toDeg();
    //-------------------------------------------------------------------------
    double dLon = lon2 - lon1;
    double y = sin(dLon) * cos(lat2);
    double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);

    return atan2(y, x);
}
1 голос
/ 20 июня 2011
0 голосов
/ 19 июня 2011

Если я вас правильно понял, у вас есть текущее местоположение, и у вас есть другое местоположение. Вы хотите найти расстояние (по прямой линии) между двумя точками и найти пешеходную дорожку между точками.

Чтобы ответить на ваш первый вопрос, distanceFromLocation найдет расстояние по всей поверхности Земли между двумя точками, то есть оно соответствует искривлению Земли, но оно даст вам расстояние по прямой линии. Поэтому я думаю, что вы правы в этом.

Второй вопрос гораздо сложнее. То, что вы хотите сделать, это то, что называется поиском пути. Метод поиска пути требует не только алгоритма поиска, который определит путь, но вам также понадобятся данные о возможных путях. То есть, если вы хотите найти путь по улицам, компьютер должен знать, как улицы связаны друг с другом. Кроме того, если вы пытаетесь создать указатель пути, который учитывает трафик и разницу во времени между двумя различными возможными путями, вам понадобится намного больше данных. Именно по этой причине мы обычно оставляем такие задачи на усмотрение крупных компаний с большим количеством ресурсов, таких как Google и Yahoo.

Однако, если вы все еще заинтересованы в этом, проверьте это http://www.youtube.com/watch?v=DoamZwkEDK0

0 голосов
/ 19 июня 2011

В зависимости от того, сколько работы вы хотите проделать в этом, я бы посоветовал взглянуть на Алгоритмы обхода дерева (проверьте столбец справа), такие вещи как A * alpha звезда , которую вы можете использовать, чтобы найти свою находку из одной точки в другую, даже если между ними есть препятствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...