Геометрические построения на поверхности Земли — хитрая штука, которая выглядит необычно, когда ее проецируют на плоскость. Кратчайшее расстояние между двумя городами в большинстве случаев превратится в дугу, по разному изогнутую в северном и южном полушариях. Прямыми останутся только линии, прочерченные с севера на юг.
На спане есть модуль с длинным названием Geo::GoogleEarth::Pluggable::Plugin::GreatCircle, который помогает рассчитать траекторию: по двум заданным точкам он формирует список точек, которые отрезками прямых с той или иной точностью рисуют кратчайший путь по поверхности планеты.
Эта программа печатает координаты 93-х точек между Москвой и Киевом.
use v5.10;
use strict;
use Geo::GoogleEarth::Pluggable;
my @moscow = (55.7522, 37.6156);
my @kiev = (50.4333, 30.5167);
my $arc =
(new Geo::GoogleEarth::Pluggable)->GreatCircleArcSegment(
startPoint => {lat => $moscow[1], lon => $moscow[0]},
endPoint => {lat => $kiev[1], lon => $kiev[0]}
);
for (@{$arc->coordinates}) {
say $_->lat, ', ', $_->lon;
}
Точность построения (иными словами, число точек и длина отрезков) возможно регулировать параметром span, переданным при вызове метода GreatCircleArcSegment. По умолчанию путь разбивается на участки длиной по 10 километров.
В ходе расчета пути выполняются другие интересные геометрические задачи, например, поиск расстояния между двумя точками, или поиск точки, которая удалена от данной на заданное расстояние в нужном направлении.
Модуль в действии дает результаты, которые иной раз кажутся невозможными (как то лететь из Казахстана в Америку через Северный полюс), но если проложить кратчайший путь на реальном глобусе, то все сходится.
А вот как выглядит путь Харьков — Хабаровск.

Комментировать