-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathm_geodesic.m
53 lines (42 loc) · 1.57 KB
/
m_geodesic.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function [s,lon,lat] = m_geodesic(lon1,lat1,lon2,lat2,Npoints,varargin)
% M_GEODESIC - Compute points along geodesics of an ellipsoidal earth.
%
% [S,LON,LAT] = m_geodesic(lon1,lat1,lon2,lat2,Npoints,spheroid)
%
% lat1 = GEODETIC latitude of first point (degrees)
% lon1 = longitude of first point (degrees)
% lat2, lon2 = second point (degrees)
% Npoints = number of points along geodesic
% spheroid = (Optional) spheroid, defaults to 'wgs84'
% S = distance in meters
% LON,LAT = points on geodesics.
%
% Note that inputs can be the same size, or a mixture of scalars and matrices.
% However, output curves will be on columns of a matrix (i.e. form of
% inputs will not be preserved).
%
% See M_FDIST, M_IDIST, M_LLDIST
% R. pawlowicz 10/Jan/2005
%
% Do the equivalent of meshgrid-type calls to make all
% matrix sizes match. To do this we can have no more than
% two different numbers in any particular dimension, and one
% of these has to be a '1'.
allsize=[size(lon1);size(lat1);size(lon2);size(lat2)];
i1=ones(1,size(allsize,2));
for k=1:size(allsize,2),
rs=unique(allsize(:,k));
if length(rs)==2 & rs(1)==1,
j1=i1;j1(k)=rs(2);
if allsize(1,k)==1,lon1=repmat(lon1,j1); end;
if allsize(2,k)==1,lat1=repmat(lat1,j1); end;
if allsize(3,k)==1,lon2=repmat(lon2,j1); end;
if allsize(4,k)==1,lat2=repmat(lat2,j1); end;
elseif length(rs)>2,
error('incompatible array sizes!');
end;
end;
% Get the distances and bearings
[S,A12,A21]=m_idist(lon1,lat1,lon2,lat2,varargin{:});
s=[0:Npoints-1]'/(Npoints-1)*S(:)';
[lon,lat]=m_fdist(lon1(:)',lat1(:)',A12(:)',s,varargin{:});