Запланируйте кратчайший путь

Вы знаете, что кратчайший путь между двумя географическими точками является большим кругом. Моряки и летчики интересуются минимизацией расстояния, путешествовавшего, и следовательно время протекло. Вы также знаете, что локсодрома является путем постоянного заголовка, естественными средними значениями перемещения. В общем случае, чтобы следовать за большим круговым путем, необходимо было бы постоянно менять курс. Это непрактично. Однако можно аппроксимировать большой круговой путь сегментами локсодромы так, чтобы добавленное расстояние было незначительно, и номер, конечно, изменяется минимальный.

Удивительно, очень немного участков дорожки локсодромы требуются, чтобы тесно аппроксимировать расстояние от большого кругового пути.

Рассмотрите путешествие из Норфолка, Вирджиния (37°N, 76°W), к Мысу Св. Винсент, Португалия (37°N, 9°W), один из маршрутов, которыми наиболее в большой степени торгуют, в Атлантике. Должно-восточная дорожка локсодромы составляет 3 213 морских миль, в то время как оптимальное большое круговое расстояние составляет 3 141 морскую милю.

Несмотря на то, что путь к локсодроме только немного больше чем на 2% более длинен, это - дополнительные 72 мили в течение прохождения. Для танкера на 12 узлов это приводит к 6-часовой задержке, и к поставке, время является деньгами. Если всего три сегмента локсодромы используются, чтобы аппроксимировать большой круг, общее расстояние прохождения составляет 3 147 морских миль. Наш танкер перенес бы только получасовую задержку по сравнению с непрерывным курсом локсодромы. Вот код для вычисления трех типов дорожек между Норфолком и Св. Винсентом:

figure('color','w');
ha = axesm('mapproj','mercator',...
           'maplatlim',[25 55],'maplonlim',[-80 0]);
axis off, gridm on, framem on;
setm(ha,'MLineLocation',15,'PLineLocation',15);
mlabel on, plabel on;
load coastlines;
hg = geoshow(coastlat,coastlon,'displaytype','line','color','b');

% Define point locs for Norfolk, VA and St. Vincent, Portugal
norfolk = [37,-76];
stvincent = [37, -9];
geoshow(norfolk(1),norfolk(2),'DisplayType','point',...
    'markeredgecolor','k','markerfacecolor','k','marker','o')
text(-0.61,0.66,'Norfolk','HorizontalAlignment','left')
geoshow(stvincent(1),stvincent(2),'DisplayType','point',...
    'markeredgecolor','k','markerfacecolor','k','marker','o')
text(0.54,0.66,'St. Vincent','HorizontalAlignment','right')

% Compute and draw 100 points for great circle
gcpts = track2('gc',norfolk(1),norfolk(2),...
               stvincent(1),stvincent(2));
geoshow(gcpts(:,1),gcpts(:,2),'DisplayType','line',...
    'color','red','linestyle','--')
text(-0.02,0.85,'Great circle: 3,141 nm (optimal)',...
    'color','r','HorizontalAlignment','center')

% Compute and draw 100 points for rhumb line
rhpts = track2('rh',norfolk(1),norfolk(2),...
                stvincent(1),stvincent(2));
geoshow(rhpts(:,1),rhpts(:,2),'DisplayType','line',...
    'color',[.7 .1 0],'linestyle','-.')
text(-0.02,0.66,'Direct course: 3,213 nm',...
    'color',[.7 .1 0],'HorizontalAlignment','center')

% Compute and draw path along three waypoints
[latpts,lonpts] = gcwaypts(norfolk(1),norfolk(2),...
    stvincent(1),stvincent(2),3);
geoshow(latpts,lonpts,'DisplayType','line',...
    'color',[.4 .2 0],'linestyle','-')
text(-0.02,0.75,'3-leg approximation: 3,149 nm',...
    'color',[.4 .2 0],'HorizontalAlignment','center')
Получившиеся дорожки и расстояния показывают ниже:

Функция Mapping Toolbox™ gcwaypts вычисляет waypoints в формате дорожки навигации для того, чтобы аппроксимировать большой круг сегментами локсодромы. Это использует этот синтаксис:

[latpts,lonpts] = gcwaypts(lat1,lon1,lat2,lon2,numlegs)

Все входные параметры для этой функции являются скалярами (запуск и конечное положение). numlegs вход является количеством желаемых участков равной длины, который равняется 10 по умолчанию. Выходные параметры являются вектор-столбцами, представляющими waypoints в навигационном формате дорожки ([heading distance]). Размером каждого из этих векторов является [(numlegs+1) 1]. Вот точки для этого примера:

[latpts,lonpts] = gcwaypts(norfolk(1),norfolk(2),...
stvincent(1),stvincent(2),3)   % Compute 3 waypoints
latpts =

   37.0000
   41.5076
   41.5076
   37.0000

lonpts =

  -76.0000
  -54.1777
  -30.8223
   -9.0000

Эти точки представляют waypoints вдоль большого круга, между которым путь к аппроксимации следует за локсодромами. Четыре точки необходимы для трех участков, потому что конечная точка в Мысе Св. Винсент должна быть включена.

Теперь мы можем вычислить расстояние в морских милях (нм) вдоль каждой дорожки и через waypoints:

drh = distance('rh',norfolk,stvincent); % Get rhumb line dist (deg)
dgc = distance('gc',norfolk,stvincent); % Get gt. circle dist (deg)
% Compute headings and distances for the waypoint legs
[course distnm] = legs(latpts,lonpts,'rh');
Наконец, сравните расстояния:
distrhnm = deg2nm(drh)            % Nautical mi along rhumb line
distgcnm = deg2nm(dgc)            % Nautical mi along great circle
distlegsnm = sum(distnm)          % Total dist along the 3 legs
rhgcdiff = distrhnm - distgcnm    % Excess rhumb line distance
trgcdiff = distlegsnm - distgcnm  % Excess distance along legs
distrhnm =

  3.2127e+003

distgcnm =

  3.1407e+003

distlegsnm =

  3.1490e+003

rhgcdiff =

   71.9980

trgcdiff =

    8.3446
Следующее всего три участка локсодромы уменьшает расстояние, путешествовавшее с 72 нм до 8,3 нм по сравнению с большим круговым курсом.

Похожие темы