The pathdist function uses the distance function to calculate cumulative distance traveled along a path given by the arrays lat and lon. This may be useful when variables such as ice thickness or velocity as a function of distance traveled along a ship track, snowmobile path, flight line, or satellite track.
Requires Matlab's Mapping Toolbox. Always assumes WGS84 ellipsoid.
If your work pertains to Antarctica and you do not have a license for Matlab's Mapping Toolbox you can use pathdistps, which is produces very similar results to pathdist, although may be slightly less accurate due to inherent distortion in the polar stereographic projection.
pathDistance = pathdist(lat,lon) pathDistance = pathdist(...,LengthUnit) pathDistance = pathdist(...,track) pathDistance = pathdist(...,'refpoint',[reflat reflon])
pathDistance = pathdist(lat,lon) returns the cumulative distance traveled along the path given by (lat,|lon|). Distance is in meters by default, referenced to the WGS84 ellipsoid. The pathDistance array will be the same size as lat and lon.
pathDistance = pathdist(...,LengthUnit) specifies any valid length unit. The following are a few LengthUnit options. See documentation for validateLengthUnit for a complete list of options.
- meter 'm', 'meter(s)', 'metre(s)' (default)
- kilometer 'km', 'kilometer(s)', 'kilometre(s)'
- nautical mile 'nm', 'naut mi', 'nautical mile(s)'
- foot 'ft', 'international ft','foot', 'international foot', 'feet', 'international feet'
- yard 'yd', 'yds', 'yard(s)'
- mile 'mi', 'mile(s)','international mile(s)'
pathDistance = pathdist(...,track) uses the input string track to specify either a great circle/geodesic or a rhumb line arc. If track equals 'gc' (the default value), then great circle distances are computed on a sphere and geodesic distances are computed on the WGS84 ellipsoid. If track equals 'rh', then rhumb line distances are computed on the WGS84 ellipsoid.
pathDistance = pathdist(...,'refpoint',[reflat reflon]) references the path distance to the point along the path nearest to [reflat reflon]. For this calculation, pathdist finds the point in lat and lon which is nearest to [reflat reflon] and assumes this point along lat,|lon| is the zero point. This is only an approximation, and may give erroneous results in cases of very sharply-curving, crossing, or otherwise spaghetti-like paths; where [reflat reflon] lies far from any point along the path, or where points along the path are spaced far apart.
For this example we'll use data from Mouginot et al. which we load with the antbounds_data function:
[lat,lon] = antbounds_data('coast'); DistanceAroundAntarctica = pathdist(lat,lon,'kilometers'); DistanceAroundAntarctica(end)
ans = 3.5491e+04
So a walk around Antarctica's coast line will take you on about a 35,000 kilometer trek. Let's see longitude as a function of distance traveled, if we go clockwise around the continent:
plot(DistanceAroundAntarctica/1000,lon,'b.') axis tight; box off; xlabel('distance traveled (thousands of km)') ylabel('longitude')
This example uses the built-in sample_route.gpx route.
route = gpxread('sample_route.gpx'); % some sample data lat = route.Latitude; lon = route.Longitude; time = 0:255; % assume GPS measurements logged every minute % Create a map of the route: figure('position',[100 50 560 800]) subplot(3,1,1) usamap([min(lat)-.05 max(lat)+.05],[min(lon)-.08 max(lon)+.08]) plotm(lat,lon,'ko-') textm(lat(1),lon(1),'start','color',[.01 .7 .1]) textm(lat(end),lon(end),'end','color','r') % Plot distance traveled: metersTraveled = pathdist(lat,lon); subplot(3,1,2) plot(time,metersTraveled) box off; axis tight; xlabel('time (minutes)') ylabel('meters traveled') % Plot speed: speed = diff(metersTraveled/1000)./diff(time/60); subplot(3,1,3) plot(time(2:end)-.5,speed) box off; axis tight xlabel('time (minutes)') ylabel('speed (km/hr)')
Adding to the plot above, we will define a reference point at (42.354 N, 71.2 W). Then we will look at travel time as a function of distance from the reference point.
reflat = 42.354; reflon = -71.2; subplot(3,1,1) plotm(reflat,reflon,'bp') textm(reflat,reflon,'reference point','color','b') kmFromRefPt = pathdist(lat,lon,'refpoint',[reflat reflon],'kilometers'); subplot(3,1,2) plot(kmFromRefPt,time) ylabel('travel time (min)') xlabel('distance from reference point (km)') axis tight; box off;
If this function or any other part of Antarctic Mapping Tools is useful for you, please cite the paper that describes AMT.
Greene, C. A., Gwyther, D. E., & Blankenship, D. D. Antarctic Mapping Tools for Matlab. Computers & Geosciences. 104 (2017) pp.151-157. doi:10.1016/j.cageo.2016.08.003.