UTM2LL
UTM2LL
% Available datums
datums = [ ...
{ 'wgs84', 6378137.0, 298.257223563 };
{ 'nad83', 6378137.0, 298.257222101 };
{ 'grs80', 6378137.0, 298.257222101 };
{ 'nad27', 6378206.4, 294.978698214 };
{ 'int24', 6378388.0, 297.000000000 };
{ 'clk66', 6378206.4, 294.978698214 };
];
if nargin < 3
error('Not enough input arguments.')
end
if nargin < 4
datum = 'wgs84';
end
if ischar(datum)
if ~any(strcmpi(datum,datums(:,1)))
error('Unkown DATUM name "%s"',datum);
end
k = find(strcmpi(datum,datums(:,1)));
A1 = datums{k,2};
F1 = datums{k,3};
else
if numel(datum) ~= 2
error('User defined DATUM must be a vector [A,F].');
end
A1 = datum(1);
F1 = datum(2);
end
% constants
D0 = 180/pi; % conversion rad to deg
maxiter = 100; % maximum iteration for latitude computation
eps = 1e-11; % minimum residue for latitude computation
C = coef(E1,1);
zt = complex((y - YS)/N/C(1),(x - X0)/N/C(1));
z = zt - C(2)*sin(2*zt) - C(3)*sin(4*zt) - C(4)*sin(6*zt) - C(5)*sin(8*zt);
L = real(z);
LS = imag(z);
l = L0 + atan(sinh(LS)./cos(L));
p = asin(sin(L)./cosh(LS));
L = log(tan(pi/4 + p/2));
if nargout < 2
lat = D0*[p(:),l(:)];
else
lat = p*D0;
lon = l*D0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function c = coef(e,m)
%COEF Projection coefficients
% COEF(E,M) returns a vector of 5 coefficients from:
% E = first ellipsoid excentricity
% M = 0 for transverse mercator
% M = 1 for transverse mercator reverse coefficients
% M = 2 for merdian arc
if nargin < 2
m = 0;
end
switch m
case 0
c0 = [-175/16384, 0, -5/256, 0, -3/64, 0, -1/4, 0, 1;
-105/4096, 0, -45/1024, 0, -3/32, 0, -3/8, 0, 0;
525/16384, 0, 45/1024, 0, 15/256, 0, 0, 0, 0;
-175/12288, 0, -35/3072, 0, 0, 0, 0, 0, 0;
315/131072, 0, 0, 0, 0, 0, 0, 0, 0];
case 1
c0 = [-175/16384, 0, -5/256, 0, -3/64, 0, -1/4, 0, 1;
1/61440, 0, 7/2048, 0, 1/48, 0, 1/8, 0, 0;
559/368640, 0, 3/1280, 0, 1/768, 0, 0, 0, 0;
283/430080, 0, 17/30720, 0, 0, 0, 0, 0, 0;
4397/41287680, 0, 0, 0, 0, 0, 0, 0, 0];
case 2
c0 = [-175/16384, 0, -5/256, 0, -3/64, 0, -1/4, 0, 1;
-901/184320, 0, -9/1024, 0, -1/96, 0, 1/8, 0, 0;
-311/737280, 0, 17/5120, 0, 13/768, 0, 0, 0, 0;
899/430080, 0, 61/15360, 0, 0, 0, 0, 0, 0;
49561/41287680, 0, 0, 0, 0, 0, 0, 0, 0];
end
c = zeros(size(c0,1),1);
for i = 1:size(c0,1)
c(i) = polyval(c0(i,:),e);
end