Plan the Shortest Path
You know that the shortest path between two geographic points is a great circle. Sailors and aviators are interested in minimizing distance traveled, and hence time elapsed. You also know that the rhumb line is a path of constant heading, the natural means of traveling. In general, to follow a great circle path, you would have to continuously alter course. This is impractical. However, you can approximate a great circle path by rhumb line segments so that the added distance is minor and the number of course changes minimal.
Surprisingly, very few rhumb line track legs are required to closely approximate the distance of the great circle path.
Consider the voyage from Norfolk, Virginia (37°N,76°W), to Cape St. Vincent, Portugal (37°N,9°W), one of the most heavily trafficked routes in the Atlantic. A due-east rhumb line track is 3,213 nautical miles, while the optimal great circle distance is 3,141 nautical miles.
Although the rhumb line path is only a little more than 2% longer, this is an additional 72 miles over the course of the trip. For a 12-knot tanker, this results in a 6-hour delay, and in shipping, time is money. If just three rhumb line segments are used to approximate the great circle, the total distance of the trip is 3,147 nautical miles. Our tanker would suffer only a half-hour delay compared to a continuous rhumb line course. Here is the code for computing the three types of tracks between Norfolk and St. Vincent:
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')
The Mapping Toolbox™ function
gcwaypts calculates waypoints in navigation
track format in order to approximate a great circle with rhumb line segments. It uses
[latpts,lonpts] = gcwaypts(lat1,lon1,lat2,lon2,numlegs)
All the inputs for this function are scalars a (starting and an ending position). The
numlegs input is the number of equal-length legs desired, which
is 10 by default. The outputs are column vectors representing waypoints in navigational
track format (
[heading distance]). The size of each of these vectors
[(numlegs+1) 1]. Here are the points for this example:
[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
These points represent waypoints along the great circle between which the approximating path follows rhumb lines. Four points are needed for three legs, because the final point at Cape St. Vincent must be included.
Now we can compute the distance in nautical miles (nm) along each track and via the 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