Расчет кратчайшего пути между двумя точками на плоской карте Земли

Как нарисовать кривую, представляющую кратчайшее расстояние между двумя точками на плоской карте Земли?

Конечно, линия не будет прямой, потому что Земля искривлена. (Например, кратчайшее расстояние между двумя аэропортами изогнуто.)

РЕДАКТИРОВАТЬ: Спасибо за все ответы, ребята - извините, я медленно выбирал решение: /


person helloworlder    schedule 08.12.2009    source источник
comment
Вы хотите смоделировать Землю в виде простой сферы или ее истинной формы (сплющенной на полюсах)? Это довольно просто, если вы упростите его до сферы.   -  person Michael Myers    schedule 08.12.2009
comment
Какую проекцию вы хотите использовать? Или не могли бы вы прояснить вопрос?   -  person retracile    schedule 08.12.2009
comment
Дубликат: stackoverflow.com/questions/23569/   -  person ire_and_curses    schedule 08.12.2009
comment
И еще кое-что: stackoverflow.com/questions/ 365826 /, stackoverflow.com/questions/1420045/   -  person ire_and_curses    schedule 08.12.2009
comment
@ire - я не согласен, что это дурак. Этим просто нужно расстояние, а этот хочет нарисовать кривую, что подразумевает, что я вычисляю промежуточные точки, чтобы построить их на графике.   -  person Paul Tomblin    schedule 08.12.2009
comment
Очевидно, существует большая путаница в том, о чем вы спрашиваете. Нарисовать кратчайший путь и вычислить кратчайшее расстояние - две очень разные задачи. С чем вам нужна помощь?   -  person Donnie DeBoer    schedule 08.12.2009
comment
Всем спасибо! Действительно полезные и подробные ответы - круто   -  person helloworlder    schedule 16.12.2009


Ответы (2)


Я получаю такую ​​информацию из авиационного формуляра.

В таком случае:

Расстояние между точками

Расстояние d по дуге большого круга между двумя точками с координатами {lat1, lon1} и {lat2, lon2} определяется как:

d=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))

Математически эквивалентная формула, которая менее подвержена ошибкам округления для коротких расстояний:

d=2*asin(sqrt((sin((lat1-lat2)/2))^2 + cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))

И

Промежуточные точки на большом круге

В предыдущих разделах мы нашли промежуточные точки на большом круге по широте или долготе пересечения. Здесь мы находим точки (lat, lon) на заданной части расстояния (d) между ними. Предположим, что начальной точкой является (lat1, lon1), а конечной точкой (lat2, lon2), и мы хотим, чтобы точка была долей f вдоль маршрута большого круга. f = 0 - это точка 1. f = 1 - это точка 2. Две точки не могут быть противоположными (т.е. lat1 + lat2 = 0 и abs (lon1-lon2) = pi), потому что тогда маршрут не определен. Промежуточные широта и долгота тогда определяются как:

    A=sin((1-f)*d)/sin(d)
    B=sin(f*d)/sin(d)
    x = A*cos(lat1)*cos(lon1) +  B*cos(lat2)*cos(lon2)
    y = A*cos(lat1)*sin(lon1) +  B*cos(lat2)*sin(lon2)
    z = A*sin(lat1)           +  B*sin(lat2)
    lat=atan2(z,sqrt(x^2+y^2))
    lon=atan2(y,x)
person Paul Tomblin    schedule 08.12.2009
comment
Пол, вы сказали, что на короткие расстояния меньше ошибок округления. Насколько короткое расстояние это подходит? Мне нужно что-то, что будет точным на расстояниях от 100 до 1000 метров. - person KevinDTimm; 08.12.2009
comment
@kevin - Я цитировал авиационный формуляр. Я понятия не имею, что он считал коротким, но я всегда использую версию с менее подверженной ошибкам округления для моего планировщика полетов. - person Paul Tomblin; 08.12.2009
comment
Спасибо! Промежуточные точки на большом круге - это именно то, что мне нужно. Между прочим, извините за то, что я не слишком ясен в вопросе - мои знания в этой области в настоящее время в лучшем случае расплывчаты. - person helloworlder; 16.12.2009

Чтобы нарисовать кратчайший трехмерный путь между двумя точками на поверхности Земли на двумерной карте поверхности Земли, вы должны знать, как трехмерная поверхность Земли была спроецирована на рассматриваемую двумерную карту. Если вы знаете используемую проекцию, вам просто нужно применить ее к кратчайшему 3D-пути, чтобы спроецировать его на 2D-карту. Если вы не знаете точную используемую проекцию, но имеете доступ к ней через какой-то интерфейс (например, входные координаты трехмерной поверхности -> выходные координаты 2D-карты), вы можете выбрать точки вдоль пути трехмерной поверхности, сгенерировать их соответствующую карту. точки через указанный интерфейс, а затем аппроксимировать проецируемый путь с помощью отрезков линии / кривых Безье / и т. д. через предполагаемые точки отбора проб.

person Donnie DeBoer    schedule 08.12.2009