Функция для линии между 2 GPS-координатами - PullRequest
2 голосов
/ 30 сентября 2010

Я пытаюсь найти функцию lng = f (lat) , которая поможет мне нарисовать линию между двумя заданными GPS-координатами, (lat1, lng1) и (lat2, lng2) .

Я пробовал традиционную декартову формулу y = mx + b, где m = (y2-y1) / (x2-x1), но GPS-координаты, похоже, не ведут себя таким образом.

Какая формула / алгоритм поможет мне достичь моей цели.

PS: я использую API Карт Google, но давайте, если возможно, не будем использовать эту реализацию.

ОБНОВЛЕНИЕ : Моя реализация была неправильной, и кажется, что алгоритм действительно работает, как указано в некоторых ответах. Мой плохой: (* ​​1017 *

schema

Ответы [ 4 ]

2 голосов
/ 30 сентября 2010

То, что вы хотите сделать, на самом деле должно работать.Имейте в виду, однако, что если север находится сверху, горизонтальная ось (x) - это ДЛИНА, а вертикальная ось (y) - это РЕШЕНИЕ (я думаю, вы могли бы запутать это).

Если вы параметризовалиline as lat = func (long), у вас возникнут проблемы с вертикальными линиями (то есть теми, которые идут точно с севера на юг), поскольку широта меняется, а долгота фиксирована.

Поэтому я бы лучше использовал другую параметризацию:

long(alpha) = long_1 + alpha * (long_2 - long_1)

lat(alpha)  = lat_1  + alpha * (lat_2  - lat_1)

и варьируются alpha от 0 до 1.

Это не совсем точно совпадает с большим кругом (кратчайший путь на сфере), но чем меньшерегион, на который вы смотрите, тем менее заметна будет разница (как отмечали другие авторы).

0 голосов
/ 11 октября 2010

Ваша цель - найти это уравнение или на самом деле нарисовать линию ?

Если последнее, так как вы используете API Карт, укажите geodesic: true и нарисуйте его с помощью Polyline:

http://code.google.com/apis/maps/documentation/javascript/reference.html#Polyline

0 голосов
/ 30 сентября 2010

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

Для больших расстояний кратчайший путь между двумя линиями проецируется не как прямая линия на карте, а как кривая. (Например, кратчайший путь из Швеции на Аляску будет проходить прямо над северным полюсом, а не за Канадой и Исландией.) Вам потребуется использовать трехмерную геометрию, чтобы нарисовать линию на поверхности сферы, а затем спроецировать ее на карта точно так же, как земная поверхность проецируется на карту.

0 голосов
/ 30 сентября 2010

Вот формула расстояния, которую я использую, которая может помочь.Это с использованием JavaScript.

function Distance(lat1, lat2, lon1, lon2) {
        var R = 6371; // km
        var dLat = toRad(lat2 - lat1);
        var dLon = toRad(lon2 - lon1);
        var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);

        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        var d = R * c * 0.621371;

        var r = Math.round(d * 100) / 100;
        return r;
    }
...